Eureka集群

目录

1、Eureka集群原理

2、Eureka集群搭建

2.1、Eureka服务端集群搭建

2.1.1、服务端代码结构

2.1.2、服务端POM文件

2.1.3、 配置文件yaml

2.1.4、配置主启动类

2.1.5、重复上述过程新建其他Eureka服务端

2.1.6、 测试

2.2、Eureka 客户端-服务提供者集群搭建

2.2.1、创建多个微服务实例

2.2.2、在微服务实例中进行Eureka客户端配置

2.2.3、在单机客户端基础上,修改客户端yaml配置

2.2.4、测试

2.3、Eureka 客户端-服务提供者集群搭建

2.3.1、服务消费者 Controller 中访问url修改

2.3.2、 yaml配置文件修改

2.3.3、赋予restTemplate负载均衡机制

2.3.4、测试

3、微服务信息完善

3.1、规范化实例ID

3.1.1、修改yaml配置文件,添加微服务实例ID

3.1.2、访问Eureka服务端查看修改结果

3.2、显示微服务IP地址

3.2.1、修改yaml配置文件,添加地址显示

3.2.2、访问Eureka服务端查看修改结果 

4、服务发现

4.1、DiscoveryClient 属性注入

4.2、调用 discoveryClient 中的方法获取微服务信息


原理概括:互相注册,相互守望

1、Eureka集群原理

  • Eureka Server 之间通过 Replicate 进行数据同步
  • 不同的 Eureka Server 之间不区分主从节点,所有节点都是平等的
  • 节点之间,通过置顶 serviceUrl 来相互注册,形成一个集群,进而提高节点的可用性
  • 在集群中,如果某个节点宕机,Eureka Client 会自动切换到新的 Eureka Server 上。
  • 每个 Eureka Server 节点,都会互相同步数据

Eureka集群_第1张图片

2、Eureka集群搭建

2.1、Eureka服务端集群搭建

2.1.1、服务端代码结构

        Cloud-eureka-server7001和Cloud-eureka-server7002均为服务端

Eureka集群_第2张图片

2.1.2、服务端POM文件

        加入spring-cloud-starter-netflix-eureka-server



    
        cloud
        com.uclass.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    Cloud-eureka-server7002

    
        11
        11
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        
            com.uclass.springcloud
            Api-Commons
            1.0-SNAPSHOT
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-actuator
        

        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        

        
            org.projectlombok
            lombok
            true
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

    


2.1.3、 配置文件yaml

  1. 声明服务端实例名称
  2. 声明其他Eureka server-url,以形成集群
server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com  #eureka服务端实例名称

  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,职责是维护服务实例,不需要检索服务
    fetchRegistry: false
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务的依赖地址
      defaultZone: http://eureka7001.com:7001/eureka/

2.1.4、配置主启动类

 加入 @EnableEurekaServer 注解,声明是Eureka服务端

@SpringBootApplication
//表名该服务是Eureka服务注册中心
@EnableEurekaServer
public class EurekaMain7002 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7002.class, args);
    }
}

2.1.5、重复上述过程新建其他Eureka服务端

2.1.6、 测试

        打开对应的服务端url,如下所示即为配置集群成功

        此处url通过 C:\Windows\System32\drivers\etc\hosts文件 添加 127.0.0.1 eureka7001.com

Eureka集群_第3张图片

2.2、Eureka 客户端-服务提供者集群搭建

2.2.1、创建多个微服务实例

2.2.2、在微服务实例中进行Eureka客户端配置

        详情参考Eureka基础 Eureka基础_我的眼里只有学习的博客-CSDN博客

2.2.3、在单机客户端基础上,修改客户端yaml配置

        添加多个 service-url:defaultZone

eureka:
 client:
  #表示将自己注册进EurekaServer默认为true
  register-with-eureka: true
  #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
  #集群必须设置为true,才能配合ribbon使用负载均衡
  fetchRegistry: true
  service-url:
#   defaultZone: http://localhost:7001/eureka #单机版
   defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版

2.2.4、测试

  • 访问 Eureka 服务端,显示多个已注册实例
  • 此处创建了两个相同的服务生产者

Eureka集群_第4张图片

2.3、Eureka 客户端-服务提供者集群搭建

服务消费者创建参考 Eureka基础_我的眼里只有学习的博客-CSDN博客

2.3.1、服务消费者 Controller 中访问url修改

在单机版基础上,首先修改服务提供者访问路径:http://服务提供者的微服务名称

@Slf4j
@RestController
public class OrderController {

    //单机版可以写死,访问的url
//    public static final String PAYMENT_URL = "http://localhost:8001";

    //联机版,寻找Eureka暴露的微服务名称
    public static final String PAYMENT_URL = "http://cloud-payment-service";

    @Resource
    private RestTemplate restTemplate;

    //添加用户信息
    @GetMapping("/consumer/payment/create")
    public CommonResult create(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

    //获取用户信息
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

2.3.2、 yaml配置文件修改

        添加多个Eureka服务端 url

server:
  port: 80

eureka:
  client:
    #表示将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
    #集群必须设置为true,才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

spring:
  application:
    name: cloud-order-service #微服务名称

2.3.3、赋予restTemplate负载均衡机制

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced   //赋予restTemplate负载均衡机制
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

 如果不赋予restTemplate负载均衡机制,访问出错: 

Eureka集群_第5张图片

2.3.4、测试

Eureka集群_第6张图片

3、微服务信息完善

3.1、规范化实例ID

3.1.1、修改yaml配置文件,添加微服务实例ID

 instance:
  # 主机名称的规范和修改
  instance-id: payment8001

完整版:

eureka:
 client:
  #表示将自己注册进EurekaServer默认为true
  register-with-eureka: true
  #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
  #集群必须设置为true,才能配合ribbon使用负载均衡
  fetchRegistry: true
  service-url:
#   defaultZone: http://localhost:7001/eureka #单机版
   defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版

 instance:
  # 主机名称的规范和修改
  instance-id: payment8001

3.1.2、访问Eureka服务端查看修改结果

3.2、显示微服务IP地址

3.2.1、修改yaml配置文件,添加地址显示

  # 访问路径可以显示IP
  prefer-ip-address: true

完整版:

eureka:
 client:
  #表示将自己注册进EurekaServer默认为true
  register-with-eureka: true
  #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
  #集群必须设置为true,才能配合ribbon使用负载均衡
  fetchRegistry: true
  service-url:
#   defaultZone: http://localhost:7001/eureka #单机版
   defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版

 instance:
  # 主机名称的规范和修改
  instance-id: payment8001
  # 访问路径可以显示IP
  prefer-ip-address: true

3.2.2、访问Eureka服务端查看修改结果 

Eureka集群_第7张图片

4、服务发现

注册进Eureka的微服务,可以通过服务发现,获得该服务的信息、

4.1、DiscoveryClient 属性注入

    @Resource
    private DiscoveryClient discoveryClient;

4.2、调用 discoveryClient 中的方法获取微服务信息

    @GetMapping(value = "/payment/discovery")
    public Object discovery(){
        List services = discoveryClient.getServices();
        for (String element:services){
            log.info("****element:" + element);
        }

        //通过微服务名称获取微服务ID
        List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance:instances){
            log.info(instance.getServiceId() + "\t" + instance.getHost()
                    + "\t" + instance.getPort() + "\t" + instance.getUri());
        }

        return this.discoveryClient;
    }

你可能感兴趣的:(微服务技术栈,eureka,云原生,cloud,native)