SpringCloud之服务注册中心--Eureka基础与进阶实战

(一)什么是服务注册中心

服务注册中心是微服务架构中非常重要的一个组件,在微服务架构中起到了协调者的作用,一般包含下面几个功能:

  1. 服务发现:保存服务提供者和服务调用者的信息;服务调用者订阅服务提供者的信息
  2. 服务配置:服务提供者和服务调用者订阅微服务相关的配置;主动将配置推送给服务提供者和服务调用者
  3. 服务健康检查:检测服务提供者的健康情况

服务注册的过程如下图所示:

服务注册中心的框架有很多,比如zookeeper,Eureka,Consul等等,Eureka是SpringCloud中的重要组件,其只满足cap定理中的ap,cap定理指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。Eureka更看重高可用性和分区容错性。

(二)Eureka的基础使用

想了解Eureka的更深介绍可以去它的官网,在这里直接对Eureka进行实践,使用Eureka的方法主要有以下三步:

1.搭建eureka server

1.1 创建工程

我们在上一章的基础上继续编码,首先在项目中创建module命名为eureka_server

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 修改配置

在resources包下新建application.properties配置文件,添加eureka相关配置,并设置端口号为9000(自定义)

server.port=9000
#指定hostname
eureka.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 配置启动类

在java包下新建EurekaApplication启动类,增加@EnableEurekaServer注解表示支持eurekaserver

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args
        );
    }
}

这个时候在浏览器中输入:http://localhost:9000/即可看到eureka的详情页面:

 

2.将服务提供者注册到eurekaServer上

我们需要把服务提供者的信息都注册到eurekaserver上,让服务调用者可以调用

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的信息

在配置文件中增加eureka的相关配置

#配置Eureka
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
#使用ip地址注册
eureka.instance.prefer-ip-address=true

 2.3 修改启动类,添加服务发现的支持

修改启动类,增加一个@EnableEurekaClient注解:

@SpringBootApplication
@EntityScan("com.sdxb.entity")
@EnableEurekaClient
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

 此时运行user_service的启动类,并刷新注册中心,可以看到user_service已经被注册上去了:

3.服务消费者通过注册中心获取服务列表,并调用

当服务注册到注册中心后,服务调用者就可以通过eureka注册中心调用服务了

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的信息

在配置文件中增加eureka的相关配置

#配置Eureka
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
#使用ip地址注册
eureka.instance.prefer-ip-address=true

3.3 在启动类增加@EnableEurekaClient注解

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注册中心宕机后仍然有其他注册中心可以使用,实现这一项功能也不难,在这里我们创建2个eureka注册中心,端口号分别为8000和9000,并且为了各个注册中心注册的服务相同,于是要实现两个注册中心的相互注册。

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=8000
eureka.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.修改两个微服务的配置文件

我们需要让每个微服务能同时注册到两个注册中心里,因为修改两个微服务的配置文件,使用逗号分隔多个注册中心:

eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:8000/eureka/

 此时再启动user_service和admin_service时就会把服务注册到两个注册中心,即使有一个断掉,服务依旧可以正常使用。

附上github源码:github源码,与这篇博客对应的代码放在version2.0分支上

发布了54 篇原创文章 · 获赞 604 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41973594/article/details/103432357