• Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务注册与发现


    一、Eureka服务注册与发现

    Eureka基础

    服务治理

    在这里插入图片描述

    服务注册

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

    Eureka组件

    在这里插入图片描述

    单继Eureka构建

    IDEA生成EurekaServer端服务注册中心

    1.创建模块

    在这里插入图片描述

    2.添加依赖
    依赖对比

    在这里插入图片描述

        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
            dependency>
            
            <dependency>
                <groupId>com.zhao.springcloudgroupId>
                <artifactId>cloud-api-commonsartifactId>
                <version>1.0-SNAPSHOTversion>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
                <scope>runtimescope>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    3.编写yml文件

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: localhost  #eureka服务端的实例名称
      client:
        #false表示不向注册中心注册自己(想注册也可以,不过没必要)
        register-with-eureka: false
        #false表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
        fetch-registry: false
        service-url:
          #设置与eurekaServer交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.主启动类

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaMain7001 {
        public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.测试

    访问:http://localhost:7001/

    在这里插入图片描述

    将EurekaClient端8001注册进EurekaServer成为服务提供者provider

    client依赖对比:

    在这里插入图片描述
    1.引入依赖

     
     <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.修改yml,添加:

    eureka:
      client:
        #true表示向注册中心注册自己,默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.修改启动类

    @SpringBootApplication
    @EnableEurekaClient
    public class PaymentMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.启动项目,注册成功!

    在这里插入图片描述

    在这里插入图片描述

    将EurekaClient端80注册进EurekaServer成为服务消费者consumer

    步骤i同 将EurekaClient端8001注册进EurekaServer成为服务提供者provider !!!

    在这里插入图片描述

    集群Eureka构建

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

    Eureka集群:相互注册,相互守望

    在这里插入图片描述

    构建EurekaServer集群环境

    • 参照cloud-eureka-server7001新建cloud-eureka-server7002
    • 修改映射配置C:\Windows\System32\drivers\etc

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

    127.0.0.1       eureka7001.com
    127.0.0.1       eureka7002.com
    127.0.0.1		eureka7003.com
    
    
    • 1
    • 2
    • 3
    • 4
    • 修改7001的yml文件
    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001.com  #eureka服务端的实例名称
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #      单机
          #      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          #集群版  相互注册,相互守望
          defaultZone: http://eureka7002.com:7002/eureka/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 修改7002的yml文件
    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002.com  #eureka服务端的实例名称
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #集群版  相互注册,相互守望
          defaultZone: http://eureka7001.com:7001/eureka/  #相互注册,相互守望
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 启动项目

    在这里插入图片描述

    将支付服务8001和订单服务80微服务发布到集群配置中

    • 把两个项目的yml文件中的defaultZone改为:
          #集群版
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    
    
    • 1
    • 2
    • 3
    • 启动四个项目

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    集群搭建完成!!

    构建支付服务提供者集群环境

    • 按照8001新建8002(除了要yml文件中需要改端口号和主配置类,其他直接复制8001的,yml文件中的应用名不需要改,因为是集群,所以应用名需要一致)
      在这里插入图片描述
    • 分别在所有的提供者的PaymentController中加入:(这个@Value是spring的注解)

    在这里插入图片描述

    • 分别启动所有服务,进行测试

    在这里插入图片描述

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

    负载均衡

    • 修改消费者的OrderController,把写死的url改为服务名称:
        public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    
    • 1
    • 在消费者的ApplicationContextConfig里的restTemplate方法上加上@LoadBalanced,开启负载均衡功能。

    重启测试 !

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

    actuator微服务信息完善

    修改8001服务和8002服务的yml

    eureka:
      client:
        #true表示向注册中心注册自己,默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
         # 新增
      instance:
        instance-id: payment8001
        prefer-ip-address: true
        
    # 8002 yml
      instance:
        instance-id: payment8002
        prefer-ip-address: true
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    服务发现Discovery

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

    • 修改提供服务的controller
      @Resource
      private DiscoveryClient discoveryClient;  
      
      @GetMapping("/payment/discovery")
        public Object discovery(){
            List<String> services = discoveryClient.getServices();
            for (String element : services) {
                log.info("*******element:"+element);
            }
    
            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 discoveryClient;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 主启动类添加注解@EnableDiscoveryClient
    • 测试
      在这里插入图片描述
      在这里插入图片描述

    Eureka自我保护

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    禁止自我保护机制

    cloud-eureka-server7001的yml文件:

    eureka:
    ......
      server:
        #关闭自我保护,默认为true
        enable-self-preservation: false
        #心跳的间隔时间,单位毫秒
        eviction-interval-timer-in-ms: 2000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    cloud-provider-payment8001的yml文件:

        #Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
        lease-renewal-interval-in-seconds: 1
        #Eureka服务端在收到最后一次心跳后等待的时间上限,单位秒(默认90秒),超时剔除服务
        lease-expiration-duration-in-seconds: 2
    
    • 1
    • 2
    • 3
    • 4

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

    二、Zookeeper服务注册与发现

    在这里插入图片描述

    注册中心Zookeeper

    在这里插入图片描述
    在服务器中部署Zookeeper服务,此处使用docker部署

    #拉取Zookeeper镜像
    docker pull zookeeper
    
    #启动Zookeeper
    docker run -d --name zk01 -p 2181:2181 --restart always  zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    关闭防火墙

    systemctl stop firewalld
    systemctl status firewalld
    
    • 1
    • 2

    在这里插入图片描述

    服务提供者

    1.新建模块

    在这里插入图片描述

    2.修改POM

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4

    3.写yml

    server:
      port: 8004
      
    spring:
      application:
        name: cloud-provider-payment
      cloud:
        zookeeper:
          connect-string: xxxxxx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.主启动

    @SpringBootApplication
    @EnableDiscoveryClient // //该注解用于向使用consul或者Zookeeper作为注册中心时注册服务
    public class PaymentMain8004 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8004.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.controller

    @RestController
    @Slf4j
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping("/payment/zk")
        public String paymentzk(){
            return "springcloud with zookeeper: " +serverPort+"\t"+ UUID.randomUUID().toString();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.启动zk容器

    在这里插入图片描述
    7.启动测试

    在这里插入图片描述
    8.进入Zookeeper容器(成功注册进注册中心)

    在这里插入图片描述
    json工具:https://tool.lu/json/

    在这里插入图片描述

    服务节点是临时节点还是持久节点?
    zookeeper也是有心跳机制,在一定时间能如果一直没心跳返回,Zookeeper就会把服务节点剔除掉。所以在Zookeeper上的服务节点是临时节点。

    服务提供者

    1.新建消费者模块cloud-consumerzk-order80。

    在这里插入图片描述
    2.pom和yml直接复制8004。(yml中端口号改为80,应用名改为cloud-consumer-order,其他都相同)
    3.主启动类。(与8004相同)
    4.创建配置类

    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6.controller

    @RestController
    @Slf4j
    public class OrderZKController {
    
        public static final String INVOKE_URL = "http://cloud-provider-payment";
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/consumer/payment/zk")
        public String paymentInfo(){
            String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7.启动项目

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

    三、Consul服务注册与发现

    Consul官网:https://www.consul.io/
    Consul中文文档:https://www.springcloud.cc/spring-cloud-consul.html

    Consul简介

    Consul是一种服务网络解决方案,使团队能够管理服务之间以及跨多云环境和运行时的安全网络连接。Consul提供服务发现、基于身份的授权、L7流量管理和服务到服务加密。

    在这里插入图片描述

    • 服务发现:Consul的客户端可以注册服务,例如api或mysql,其他客户端可以使用Consul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们依赖的服务。
    • 健康检测:领事客户端可以提供任意数量的运行状况检查,这些检查可以与给定服务(“ Web服务器是否返回200OK”)或本地节点(“内存利用率低于90%”)相关。操作员可以使用此信息来监视群集的运行状况,服务发现组件可以使用此信息将流量从不正常的主机发送出去。
    • KV存储:应用程序可以将Consul的分层键/值存储用于多种目的,包括动态配置,功能标记,协调,领导者选举等。简单的HTTPAPI使其易于使用。
    • 安全的服务通信:领事可以为服务生成并分发TLS证书,以建立相互TLS连接。 意图可用于定义允许哪些服务进行通信。可以使用可以实时更改的意图轻松管理服务分段,而不必使用复杂的网络拓扑和静态防火墙规则。
    • 多数据中心:Consul开箱即用地支持多个数据中心。这意味着Consul的用户不必担心会构建其他抽象层以扩展到多个区域。

    Consul旨在对DevOps社区和应用程序开发人员友好,使其非常适合现代,灵活的基础架构。

    安装并运行Consul

    docker安装Consul

    #拉取consul镜像
    docker pull consul
    
    #启动consul
    docker run -d  -p 8500:8500/tcp --name myConsul  consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    测试访问

    在这里插入图片描述

    服务提供者

    1.新建模块

    在这里插入图片描述

    2.修改POM,其他和之前一样,将zookeeper替换如下

     <!--SpringCloud consul-server-->
      
          org.springframework.cloud
          spring-cloud-starter-consul-discovery
      
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.编写YML

    server:
      port: 8006
    
    spring:
      application:
        name: consul-provider-payment
      cloud:
        consul:
          host: 139.196.177.161   #用linux的ip地址(consul在本机就填localhost)
          port: 8500
          discovery:
            service-name: ${spring.application.name}
            prefer-ip-address: true
            register-health-check: false
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.主启动

    @SpringBootApplication
    @EnableDiscoveryClient
    public class PaymentMain8006 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8006.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.业务类

    @RestController
    @Slf4j
    public class PaymentController {
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping("/payment/consul")
        public String paymentConsul(){
            return "springcloud with zookeeper: " +serverPort+"\t"+ UUID.randomUUID().toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    6.测试启动
    在这里插入图片描述
    在这里插入图片描述

    服务消费者

    1.新建模块cloud-consumer-consul-order80

    在这里插入图片描述

    1. pom(与8006相同)

    3.yml(端口号为80,应用名为consul-consumer-order,其他和8006相同)

    server:
      port: 80
    
    spring:
      application:
        name: consul-consumer-order
      cloud:
        consul:
          host: 139.196.177.161   #用linux的ip地址(consul在本机就填localhost)
          port: 8500
          discovery:
            service-name: ${spring.application.name}
            prefer-ip-address: true
            register-health-check: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.主启动类(与8006相同)

    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderConsulMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderConsulMain80.class);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.config(和zk的消费者相同)
    6.controller

    @RestController
    @Slf4j
    public class OrderConsulController {
        public static final String INVOKE_URL = "http://consul-provider-payment";
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/consumer/payment/consul")
        public String paymentInfo(){
            String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    7.测试

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

    四、三个注册中心异同

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

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

    在这里插入图片描述
    CP:

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

  • 相关阅读:
    关于订单功能的处理和分析
    【数据结构与算法】- 数组
    Linux mdeltree命令教程:详解删除MS-DOS文件系统中的目录及其包含的所有文件和子目录的命令(附实例详解和注意事项)
    Nginx跨域防盗链搭建3台Tomcat集群
    C++一些新的特性的理解(二)
    设计模式-责任链-笔记
    【密码学】块加密(分组加密)的工作模式
    数据结构绪论思维导图
    Java与Redis的集成
    算法与数据结构 --- 串,数组和广义表 --- 串
  • 原文地址:https://blog.csdn.net/Zp_insist/article/details/127801458