# (一)什么是服务注册中心 {#一-什么是服务注册中心}
服务注册中心是微服务架构中非常重要的一个组件,在微服务架构中起到了协调者的作用,一般包含下面几个功能:
服务发现:保存服务提供者和服务调用者的信息;服务调用者订阅服务提供者的信息 服务配置:服务提供者和服务调用者订阅微服务相关的配置;主动将配置推送给服务提供者和服务调用者 服务健康检查:检测服务提供者的健康情况
服务注册的过程如下图所示:
服务注册中心的框架有很多,比如zookeeper,Eureka,Consul等等,Eureka是SpringCloud中的重要组件,其只满足cap定理中的ap,cap定理指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。Eureka更看重高可用性和分区容错性。
# (二)Eureka的基础使用 {#二-eureka的基础使用}
想了解Eureka的更深介绍可以去它的官网,在这里直接对Eureka进行实践,使用Eureka的方法主要有以下三步:
# 1.搭建eureka server {#_1-搭建eureka-server}
# 1.1 创建工程 {#_1-1-创建工程}
我们在上一章的基础上继续编码,首先在项目中创建module命名为eureka_server
# 1.2 导入依赖 {#_1-2-导入依赖}
在eureka_server的pom.xml文件中增加下面的依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency></dependencies>
# 1.3 修改配置 {#_1-3-修改配置}
在resources包下新建application.properties配置文件,添加eureka相关配置,并设置端口号为9000(自定义)
server.port=9000#指定hostnameeureka.instance.hostname=localhost#是否将自己注册到注册中心eureka.client.register-with-eureka=false #是否从eureka中获取注册信息eureka.client.fetch-registry=false#配置暴露给Eureka client的请求地址eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
# 1.4 配置启动类 {#_1-4-配置启动类}
在java包下新建EurekaApplication启动类,增加@EnableEurekaServer注解表示支持eurekaserver
@SpringBootApplication@EnableEurekaServerpublic class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args );
}}
这个时候在浏览器中输入:http://localhost:9000/即可看到eureka的详情页面:
# 2.将服务提供者注册到eurekaServer上 {#_2-将服务提供者注册到eurekaserver上}
我们需要把服务提供者的信息都注册到eurekaserver上,让服务调用者可以调用
# 2.1 引入EurekaClient的相关依赖 {#_2-1-引入eurekaclient的相关依赖}
修改user_service的pom.xml,添加eureka client依赖
<!--引入EurekaClient--><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
# 2.2 修改配置,添加EurekaServer的信息 {#_2-2-修改配置-添加eurekaserver的信息}
在配置文件中增加eureka的相关配置
#配置Eurekaeureka.client.service-url.defaultZone=http://localhost:9000/eureka/#使用ip地址注册eureka.instance.prefer-ip-address=true
# 2.3 修改启动类,添加服务发现的支持 {#_2-3-修改启动类-添加服务发现的支持}
修改启动类,增加一个@EnableEurekaClient注解:
@SpringBootApplication@EntityScan("com.sdxb.entity")@EnableEurekaClientpublic class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}}
此时运行user_service的启动类,并刷新注册中心,可以看到user_service已经被注册上去了:
# 3.服务消费者通过注册中心获取服务列表,并调用 {#_3-服务消费者通过注册中心获取服务列表-并调用}
当服务注册到注册中心后,服务调用者就可以通过eureka注册中心调用服务了
# 3.1 引入EurekaClient的相关依赖 {#_3-1-引入eurekaclient的相关依赖}
修改admin_service的pom.xml,添加eureka client依赖
<!--引入EurekaClient--><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
# 3.2 修改配置,添加EurekaServer的信息 {#_3-2-修改配置-添加eurekaserver的信息}
在配置文件中增加eureka的相关配置
#配置Eurekaeureka.client.service-url.defaultZone=http://localhost:9000/eureka/#使用ip地址注册eureka.instance.prefer-ip-address=true
# 3.3 在启动类增加@EnableEurekaClient注解 {#_3-3-在启动类增加-enableeurekaclient注解}
# 3.4 调用user微服务 {#_3-4-调用user微服务}
在前一个博客中,我们调用user微服务是通过直接填入url的方式进行调用,当有了注册中心之后,我们就可以通过注册中心进行调用。修改adminController
@RestController@RequestMapping("/admin")public class adminController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public User getuser(@PathVariable int id){
//修改前通过url调用微服务
//User user= restTemplate.getForObject("http://127.0.0.1:9001/user/1",User.class);
List<ServiceInstance> instances = discoveryClient.getInstances("user_service");
ServiceInstance serviceInstance = instances.get(0);
User user= restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()
+"/user/1",User.class);
return user;
}}
在这里通过DiscoveryClient 来调用注册中心中的微服务,首先自动注入DiscoveryClient ,通过getInstances(服务名)的方法得到服务实例,这个实例中包含有微服务的所有元数据,即请求url等数据,因为user_service只有一条数据,所以用instance.get(0)取到实例,然后修改url的写法来调用user微服务。
启动admin_service,在浏览器中访问http://localhost:9002/admin/1,得到和之前一样的数据,这就实现了服务注册中心的功能。
# (三)Eureka的进阶使用 {#三-eureka的进阶使用}
前面我们已经讲到了Eureka支持高可用性,即一个eureka注册中心宕机后仍然有其他注册中心可以使用,实现这一项功能也不难,在这里我们创建2个eureka注册中心,端口号分别为8000和9000,并且为了各个注册中心注册的服务相同,于是要实现两个注册中心的相互注册。
# 1.修改eureka配置文件 {#_1-修改eureka配置文件}
因为要实现注册中心的相互注册,因此我们之前写的两个false都要改为true
eureka.client.register-with-eureka=true #是否从eureka中获取注册信息eureka.client.fetch-registry=true
因为端口为9000的注册中心要注册给端口为8000的注册中心,于是修改service-url
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8000/eureka/
使用run dashboard启动EurekaApplication,此时会发现正在报错,因为找不到8000的端口,直接在Run Dashboard下copy一个新的节点:
我把它命名为EurekaApplication2,然后修改eureka的配置文件,设置端口为8000,请求地址为9000
server.port=8000eureka.instance.hostname=localhost#是否将自己注册到注册中心eureka.client.register-with-eureka=true #是否从eureka中获取注册信息eureka.client.fetch-registry=true#配置暴露给Eureka client的请求地址eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:9000/eureka/
启动我们copy的节点,会发现不报错了,页面效果也如上所示。浏览器中输入http://localhost:8000/和http://localhost:9000/,都成功展示eureka详情,并且互相注册成功。
# 2.修改两个微服务的配置文件 {#_2-修改两个微服务的配置文件}
我们需要让每个微服务能同时注册到两个注册中心里,因为修改两个微服务的配置文件,使用逗号分隔多个注册中心:
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:8000/eureka/
此时再启动user_service和admin_service时就会把服务注册到两个注册中心,即使有一个断掉,服务依旧可以正常使用。