服务治理其实和注册中心一回事。Eureka包含两个组件:Eureka Server(注册中心)和Eureka Client(服务消费者和服务提供者)。

一. 搭建Eureka Server


1.1 建立父工程spring cloud,导入相关坐标

  1. <!--spring boot 环境 -->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.1.0.RELEASE</version>
  6. <relativePath/>
  7. </parent>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  11. <java.version>1.8</java.version>
  12. <!--spring cloud 版本-->
  13. <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
  14. </properties>
  15. <!--引入Spring Cloud 依赖-->
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-dependencies</artifactId>
  21. <version>${spring-cloud.version}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. </dependencies>
  26. </dependencyManagement>

1.2 建立module eureka-server,导入相关坐标

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!-- eureka-server -->
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  10. </dependency>
  11. </dependencies>

1.3 建立yml配置文件

  1. server:
  2. port: 8761
  3. # eureka 配置
  4. # eureka 一共有4部分 配置
  5. # 1. dashboard:eureka的web控制台配置
  6. # 2. server:eureka的服务端配置
  7. # 3. client:eureka的客户端配置
  8. # 4. instance:eureka的实例配置
  9. eureka:
  10. instance:
  11. hostname: localhost # 主机名
  12. client:
  13. service-url:
  14. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
  15. register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
  16. fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要

1.4 建立启动类

  1. @SpringBootApplication
  2. // 启用EurekaServer
  3. @EnableEurekaServer
  4. public class EurekaApp {
  5. public static void main(String[] args) {
  6. SpringApplication.run(EurekaApp.class,args);
  7. }
  8. }

二. 搭建Eureka Client


Eureka Client包括服务提供者,和服务消费者。

2.1 服务提供者


2.1.1 建立module eureka-provider,导入相关坐标

  1. <dependencies>
  2. <!--spring boot web-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- eureka-client -->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  11. </dependency>
  12. </dependencies>

2.1.2 配置yml

  1. server:
  2. port: 8001
  3. eureka:
  4. instance:
  5. hostname: localhost # 主机名
  6. client:
  7. service-url:
  8. defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
  9. spring:
  10. application:
  11. name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径

2.1.3 启动类

  1. @EnableEurekaClient //该注解 在新版本中可以省略
  2. @SpringBootApplication
  3. public class ProviderApp {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderApp.class,args);
  6. }
  7. }

2.2 服务消费者


2.2.1 配置yml文件

  1. server:
  2. port: 9000
  3. eureka:
  4. instance:
  5. hostname: localhost # 主机名
  6. client:
  7. service-url:
  8. defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
  9. spring:
  10. application:
  11. name: eureka-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径

2.2.2 使用RestTemplate进行远程连接

在Consumer消费端建立一个配置类RestTemplateConfig:

  1. @Configuration
  2. public class RestTemplateConfig {
  3. @Bean//交给IOC容器管理
  4. public RestTemplate restTemplate(){
  5. return new RestTemplate();
  6. }
  7. }

进行远程调用。并使用DiscoveryClient动态获取端口或IP

  1. /**
  2. * 服务的调用方
  3. */
  4. @RestController
  5. @RequestMapping("/order")
  6. public class OrderController {
  7. @Autowired
  8. private RestTemplate restTemplate;
  9. @Autowired
  10. private DiscoveryClient discoveryClient;
  11. @GetMapping("/goods/{id}")
  12. public Goods findGoodsById(@PathVariable("id") int id){
  13. /*
  14. 动态从Eureka Server 中获取 provider 的 ip 和端口
  15. 1. 注入 DiscoveryClient 对象.激活
  16. 2. 调用方法
  17. */
  18. //演示discoveryClient 使用
  19. List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-PROVIDER");
  20. //判断集合是否有数据
  21. if(instances == null || instances.size() == 0){
  22. //集合没有数据
  23. return null;
  24. }
  25. ServiceInstance instance = instances.get(0);
  26. String host = instance.getHost();//获取ip
  27. int port = instance.getPort();//获取端口
  28. System.out.println(host);
  29. System.out.println(port);
  30. String url = "http://"+host+":"+port+"/goods/findOne/"+id;
  31. // 3. 调用方法
  32. Goods goods = restTemplate.getForObject(url, Goods.class);
  33. return goods;
  34. }
  35. }

2.2.3 启动类

  1. @EnableDiscoveryClient // 激活DiscoveryClient
  2. @EnableEurekaClient
  3. @SpringBootApplication
  4. public class ConsumerApp {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ConsumerApp.class,args);
  7. }
  8. }

注意:引入SpringCloud依赖时,需要注意和Spring Boot的版本需要匹配上,具体可以进官网查看:https://spring.io/projects/spring-cloud.
2021-03-13_122122.png

三. Eureka高可用

Eureka高可用其实就是搭建集群。

  1. 准备多个Eureka-Server,这里准备2个,eureka-server-1,eureka-server-2;
  2. 分别进行配置,相互注册。

eureka-server-1中注册eureka-server-2

  1. eureka:
  2. instance:
  3. hostname: eureka-server1 # 主机名(这里生产环境中写上ip地址)
  4. client:
  5. service-url:
  6. defaultZone: http://eureka-server2:8762/eureka
  7. register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
  8. fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
  9. spring:
  10. application:
  11. name: eureka-server-ha #名字都起一样的

同理,eureka-server-2中也需要注册eureka-server-1

consumer和provider修改配置:

  1. eureka:
  2. instance:
  3. hostname: localhost # 主机名
  4. prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名
  5. ip-address: 127.0.0.1 # 设置当前实例的ip
  6. instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
  7. lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
  8. lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
  9. client:
  10. service-url:
  11. defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
  12. spring:
  13. application:
  14. name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径

注意defaultZone,将所有的eureka-server都写进去,eureka-server1、eureka-server2都是IP地址,测试环境中采用修改端口,生产环境中端口都是一致的。