Eureka2.0已经闭源了,但也是注册中心的热门组件,我们了解他的使用以及原理。
服务端
首先是parent的pom配置,这里使用的是Hoxton.SR9版本。
<properties>
<spring.cloud-version>Hoxton.SR9</spring.cloud-version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后是服务端的pom配置
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
服务端代码,除了@SpringBootApplication注解,还需要@EnableEurekaServer注解。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8888Application {
public static void main(String[] args){
SpringApplication.run(EurekaServer8888Application.class, args);
}
}
yml文件配置:
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
# 单个注册中心服务的时候不注册自己
register-with-eureka: false
# 单个注册中心服务的时候不拉取数据
fetch-registry: false
spring:
application:
name: eureka-server
上面配置完后,运行EurekaServer8888Application的main方法,访问http://127.0.0.1:8888,出现以下界面,Eureka服务端配置完成。
客户端
pom的配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
提供方
yml配置:
server:
port: 7000
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
spring:
application:
name: eureka-provider
提供方Application代码:
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
Controller代码:
@RestController
public class ProviderController {
@RequestMapping("/getInfo")
public String getInfo(String name) {
return "provider-" + name;
}
}
启动ProviderApplication后,查看服务端的地址,可以看到已经注册到注册中心了。
此时的状态是这样的:
消费方
yml配置
server:
port: 7500
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
spring:
application:
name: eureka-consumer
消费方Application代码,注意这边有一个@LoadBalanced注解的RestTemplate。
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Controller代码,我们这边访问的地址是eureka-provider,并没有访问到具体的ip和端口。
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/getInfo")
public String getInfo(String name) {
ResponseEntity<String> forEntity = restTemplate.getForEntity("http://eureka-provider/getInfo?name=" + name, String.class);
return forEntity.getBody();
}
}
启动ConsumerApplication后,查看服务端的地址,可以看到已经注册到注册中心了。
此时的状态是这样的:
通过地址调用消费方,可以看到调用成功:
因为Consumer在调用Provider之前,会通过服务发现拿到注册中心的注册表信息,然后通过通过注册表信息去找到Provider的IP和端口,再进行调用。
服务端高可用
在生成过程中,为了高可用,我们会搭建多个Euraka Server,这里演示两个,再加一个9999端口的Server。
首先是8888的yml修改,注释掉register-with-eureka和fetch-registry,这样使用默认值true,另外defaultZone的地址为另外一个Server的地址。
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://localhost:9999/eureka/
# 单个注册中心服务的时候不注册自己
#register-with-eureka: false
# 单个注册中心服务的时候不拉取数据
#fetch-registry: false
spring:
application:
name: eureka-server
9999的配置如下,跟上面差不多:
server:
port: 9999
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
spring:
application:
name: eureka-server
Consumer和Provider的yml的defaultZone都修改为:
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/,http://localhost:9999/eureka/
四个Application启动后,不管访问的是8888端口还是9999端口,都可以看到以下信息:
此时的状态是这样的:
Eureka的简单示例就到这边,后面我们看看他的源码是怎么实现这些功能的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。