03-Eureka注册中心
三、Eureka注册中心
- 假如本案例的服务提供者user-service部署了多个实例,如图所示
- 那么就会带来如下几个问题
- ①、order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
- ②、有多个user-service实例地址,order-service调用时该如何选择?
- ③、order-service如何得知某个user-service实例是否正常,或者宕机?
3.1、Eureka的结构和作用
- 上述提到的问题,那么就不得不提到Spring Cloud中的注册中心,其中最广为人知的注册中心就是Eureka,其结构如下所示
- 问题1:order-service如何得知user-service实例地址?
- 获取地址信息的流程如下
- ①、user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
- ②、eureka-server保存服务名称到服务实例地址列表的映射关系
- ③、order-service根据服务名称,拉取实例地址列表。这个叫服务发现或者服务拉取
- 获取地址信息的流程如下
- 问题2:order-service如何从多个user-service实例中选择具体的实例?
- ①、order-service从实例列表中利用负载均衡算法选中一个实例地址
- ②、向该实例地址发起远程调用
- 问题3:order-service如何得知某个user-service实例是否正常,或者宕机?
- ①、user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己的状态,称为心跳
- ②、当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
- ③、order-service拉取服务的时候,就能将故障实例派出了
注意事项
- 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端
3.2、搭建eureka-server
3.2.1、创建eureka-server服务
- 在cloud-demo父工程下,创建一个子模块,如下所示
3.2.2、引入eureka依赖
-
引入SpringCloud为eureka提供的starter服务器端依赖
-
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
-
3.2.3、编写启动类
-
给eureka-server服务编写一个启动类,一定要添加一个
@EnableEurekaServer
注解,开启eureka的注册中心功能-
package cn.coolman; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
-
3.2.4、编写配置文件
-
编写一个applicaiton.yml文件,编写的内容如下所示
- 1、服务器端口号
- 2、服务器的服务名
- 3、注册中心的访问地址(最后一项defaultZone需要手动敲上去,并且URL地址前面有空格)
-
# 服务器端口号 server: port: 10086 spring: application: name: eureka-server # 注册中心服务的访问地址 eureka: client: service-url: defaultZone: http://localhost:10086/eureka
3.2.5、启动服务
- 启动服务,然后在浏览器访问:http://localhost:10086
3.3、服务注册
- 接下来,我们就可以将user-service注册到eureka-server中去(先开启服务器端,在开启客户端)
3.3.1、引入依赖
-
在user-service的pom文件,引入下面的eureka-client客户端依赖
-
<!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
3.3.2、修改配置文件
- 在user-service中,修改applicaiton.yml文件
- ①、添加服务器名称:userservice(微服务名称中没有短横)
- ②、eureka的访问地址,与服务器端的访问地址相同(后面的defalutZone需要手动敲上去)
3.3.3、启动多个user-service实例
- 为了演示一个服务有多个实例的场景,可以添加一个SpringBoot的启动配置,再启动n个user-service
- ①、修改server.port的值参数
- ②、编辑运行时jvm的参数
- ③、复制一个相同的程序并且修改端口
- ①、修改server.port的值参数
- 重启所有user-service服务,刷新查看eureka-server管理界面
3.4、服务发现
- 下面,我们将order-service的逻辑修改一下
- 向eureka-server拉取user-service的信息,实现服务发现
3.4.1、引入依赖
-
之前说过,服务发现、服务注册统一都封装台eureka-client依赖,因此这一步与服务注册一致
-
在order-service的pom文件中,引入下面的eureka-client客户端依赖
-
<!-- eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
3.4.2、修改配置文件
-
服务发现也需要知道eureka地址,因此第二部与服务注册一样,都是配置eureka信息
-
同时添加服务名称orderservice
-
application: name: orderservice eureka: client: service-url: defalutZone: http://localhost:10086/eureka
3.4.3、服务拉取和负载均衡
-
最后,需要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡
-
不过这些动作并不需要我们去实现,只需要添加一些注解即可
-
①、在order-service的OrderApplication中,给RestTemplate这个Bean添加一个
@LoadBalanced
注解(LoadBalance中文意思是负载均衡) -
②、修改order-service服务中的
cn.coolman.order.service
包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务器名替代IP、端口-
@GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) { // 根据id查询订单并返回 Order order = orderService.queryOrderById(orderId); // User user = restTemplate.getForObject("http://localhost:8081/user/" + order.getUserId(), User.class); User user = restTemplate.getForObject("http://userservice/user/" + order.getUserId(), User.class); order.setUser(user); return order; } -
Spring会自动帮助我们从eureka-server端,根据user-service这个服务名称,获取实例列表,而后完成负载均衡
-
-
③、启动orderservice服务,查看eureka管理界面
-
④、再次访问order的微服务(访问六次)
-
⑤、查看此时eureka的负载均衡,是分配到了哪个user-service
- 最终发现,三个user-service服务,都分配到了两次请求,由此可见Eureka的负载均衡默认是轮询
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?