SpringCloud --- 服务注册中心 (EurekaZookeeperConsul)

Posted 黑桃️

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud --- 服务注册中心 (EurekaZookeeperConsul)相关的知识,希望对你有一定的参考价值。

服务注册中心


一、Eureka服务注册与发现 (×)

🔺 单机Eureka构建步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(1) EurekaServer 服务端搭建

① 新建模块 cloud-eureka-server7001

② 配置 pom.xml

在这里插入图片描述

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7001</artifactId>

    <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.lun.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--boot web actuator-->
        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>

③ 配置 application.yml

在这里插入图片描述

server:
  port: 7001

eureka:
  instance:
    hostname: locathost #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己。
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

④ 主启动类

在这里插入图片描述

@SpringBootApplication
@EnableEurekaServer // 表示为EurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args);
    }
}

⑤ 测试

eureka服务有了,但是没有客户(有server但是client没有注册进去)
在这里插入图片描述

(2) 将支付微服务8001注册到 EurekaServer

① 添加依赖到pom.xml

在这里插入图片描述

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

② 添加配置到 application.yml

在这里插入图片描述

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

③ 主启动类上加注解 @EnableEurekaClient

@EnableEurekaClient // 表明是EurekaClient

在这里插入图片描述

④ 测试

在这里插入图片描述

(3) 将订单微服务80注册到 EurekaServer

① 添加依赖到 pom.xml

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

② 添加配置到 application.yml

spring:
  application:
    name: cloud-order-service

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

③ 主启动类上加注解 @EnableEurekaClient

@EnableEurekaClient // 表明是EurekaClient

④ 测试

在这里插入图片描述


🔺 集群Eureka构建步骤

Eureka 集群
在这里插入图片描述
解决办法: 搭建Eureka注册中心集群,实现负载均衡+故障容错

(1) Eureka集群环境构建步骤

① 新建模块 cloud-eureka-server7002

pom中依赖和7001相同
在这里插入图片描述

② 修改映射配置

找到C:\\Windows\\System32\\drivers\\etc路径下的hosts文件

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

在这里插入图片描述
通过命令:ipconfig /flushdns 刷新hosts文件

7001的 application.yml

server:
  port: 7001
spring:
  application:
    name: cloud-eureka-service
eureka:
  instance:
    # eureka服务端的实例名称
    hostname: eureka7001.com
  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/

7002的 application.yml

server:
  port: 7002
spring:
  application:
    name: cloud-eureka-service2
eureka:
  instance:
    hostname:  eureka7002.com
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

⑤ 7002的主启动类

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

⑥ 测试

在这里插入图片描述
在这里插入图片描述

(2) 将支付服务8001,和订单服务80微服务发布到上面2台Eureka集群配置中

① 修改二者 yaml 即可

defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版

② 测试

在这里插入图片描述
在这里插入图片描述

(3) 支付服务提供者8001集群环境搭建

① 新建模块 cloud-provider-payment8002

pom文件的依赖和8001相同
yaml文件除了server-port为8002,其他与8001的都相同
主启动类
业务类也与8001相同
在这里插入图片描述

② 修改8001和8002的controller

取出yaml中的servre-port,便于测试时的分析

@Value("${server.port}")
private String serverPort;

在这里插入图片描述

③ 修改80客户端的 PAYMENT_URL

订单服务的访问地址不能写si,之前是指定的8001,现在支付服务是集群环境,所以需要用服务名进行访问

public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

在这里插入图片描述
由于一个集群中有多个服务,所以此时使用客户80访问时,会报错,因为不知道具体访问的是集群中的哪个服务,所以需要在 getRestTemplate上添加一个注解@LoadBalanced均衡负载,循环访问集群中的每个服务

在这里插入图片描述

④ 测试

在这里插入图片描述
在这里插入图片描述


🔺 actuator微服务信息完善

(1) 主机名称:服务名称修改

在这里插入图片描述

修改yaml文件

eureka:
	instance:
     	instance-id: payment8001 #修改服务名称

在这里插入图片描述

(2) 访问信息有IP信息提示

在这里插入图片描述
此时没有IP信息显示

修改yaml文件
在这里插入图片描述

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

在这里插入图片描述


🔺 服务发现Discovery

对于注册eureka里面的微服务,可以通过服务发现来获得该服务的信息

(1) 修改cloud-provider-payment8001的Controller

注意discoveryClient的包时spring的那个,如果没有.getServices(),可以看看是不是包导错了

// 服务发现 获取服务信息
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/payment/discover")
public DiscoveryClient discover() {

    // 获取注册中心的服务列表
    List<String> services = discoveryClient.getServices();

    for (String service : services) {
        log.info("****服务:" + service);
    }

    // 获取某个服务的实例
    List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

    for (ServiceInstance instance : instances) {
        log.info("服务cloud-payment-service中有: " + "\\t" + instance.getServiceId() + "\\t" + instance.getInstanceId() + "\\t" + instance.getHost());
    }

    return this.discoveryClient;
}

(2) 8001的启动类添加@EnableDiscoveryClient

就用原来的@EnableEurekaClient似乎也是可以的

@SpringBootApplication
// 表明是EurekaClient,且只适用于Eureka注册中心
@EnableEurekaClient
// 二者都是可以让注册中心发现,扫描到该服务,区别在于EnableEurekaClient只适用于Eureka注册中心,而EnableDiscoveryClient可以为其他注册中心
@EnableDiscoveryClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

(3) 测试

在这里插入图片描述

在这里插入图片描述


🔺 eureka自我保护

(1) 故障现象

在这里插入图片描述

(2) 导致原因

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3) 如何禁止自我保护

① 7001的yaml中关闭自我保护模式

在这里插入图片描述

enable-self-preservation: false # 禁止eureka的自我保护,服务一旦没有"心跳",就会被剔除

在这里插入图片描述

② 8001中修改配置,方便测试查看效果

在这里插入图片描述

lease-renewal-interval-in-seconds: 1 # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)e

lease-expiration-duration-in-seconds: 2 # Eureka服务端在收到最后一次心跳后等待时间上限 ,单位为秒(默认是90秒),超时剔除服务

③ 测试

可以同时启动 7001(禁用自我保护) 和 7002(默认开启自动保护),然后启动8001,再stop 8001,就可以看到 7001中很快剔除8001,而7002中还有


二、Zookeeper服务注册与发现 (√)

🔺 注册中心Zookeeper

Zookeeper是一个分布式协调工具,可以实现注册中心功能

Zookeeper服务器 取代 Eureka服务器,zk作为服务注册中心


🔺 服务提供者

(1) 新建模块 cloud-provider-payment8004

在这里插入图片描述

(2) 配置 pom.xml

<?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>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8004</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--SpringBoot整合Zookeeper客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId

以上是关于SpringCloud --- 服务注册中心 (EurekaZookeeperConsul)的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud学习之服务注册中心

SpringCloud系列服务注册中心Eureka基础

SpringCloud01——服务的注册和发现

SpringCloud笔记Eureka服务注册中心Zookeeper服务注册中心Consul服务注册中心案例详解

SpringCloud--注册中心Eureka

springcloud:注册中心Eureka