0


Eureka集群

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

1、Eureka集群原理

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

2、Eureka集群搭建

2.1、Eureka服务端集群搭建

2.1.1、服务端代码结构

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

2.1.2、服务端POM文件

    加入spring-cloud-starter-netflix-eureka-server
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.uclass.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Cloud-eureka-server7002</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>com.uclass.springcloud</groupId>
            <artifactId>Api-Commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

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

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 服务端,显示多个已注册实例
  • 此处创建了两个相同的服务生产者

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<Payment> create(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

    //获取用户信息
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> 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负载均衡机制,访问出错:

2.3.4、测试

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服务端查看修改结果

4、服务发现

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

4.1、DiscoveryClient 属性注入

    @Resource
    private DiscoveryClient discoveryClient;

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

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

        //通过微服务名称获取微服务ID
        List<ServiceInstance> 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;
    }

本文转载自: https://blog.csdn.net/weixin_44302046/article/details/124578150
版权归原作者 我的眼里只有学习 所有, 如有侵权,请联系我们删除。

“Eureka集群”的评论:

还没有评论