SpringCloud学习笔记——服务注册中心——Eureka

SpringCloud学习笔记——服务注册中心——Eureka

参考:尚硅谷2020最新版SpringCloud(H版&alibaba)——周阳

1. Eureka

单机版

  1. 创建子模块,子模块名称

    cloud-eureka-server7001

  2. pom依赖

    <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.naclo</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>
    
  3. 创建application.yml

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: localhost #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://${eureka.instance.hostname}.com:${server.port}/eureka/
    
  4. 创建主启动类EurekaMain7001

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaMain7001 {
        public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class, args);
        }
    }
    
  5. 启动测试,访问地址http://localhost:7001/
    在这里插入图片描述

  6. 微服务提供者,支付模块入驻Eureka

    1. 添加pom依赖

      <!--eureka-client-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      
    2. 修改application.yml添加

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

      @SpringBootApplication
      @EnableEurekaClient
      public class PaymentMain8001 {
          public static void main(String[] args) {
              SpringApplication.run(PaymentMain8001.class, args);
          }
      }
      
    4. 运行,测试
      在这里插入图片描述

  7. 微服务消费者,用户模块入驻Eureka

    1. 如上三步,添加配置

    2. 运行,测试
      在这里插入图片描述

集群版

  1. 创建子模块,子模块名称

    cloud-eureka-server7002

  2. pom依赖

    <dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.naclo</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>
    
  3. 修改映射名称

    打开C:\Windows\System32\drivers\etc下hosts文件

    在末尾添加映射

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com
    127.0.0.1 eureka7003.com
    
  4. 修改7001 application.yml

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001.com #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://eureka7002.com:7002/eureka/
    
  5. 修改7002 application.yml

    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002.com #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/
    
  6. 创建主启动类EurekaMain7002

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

    • 访问地址http://eureka7001.com:7001
      在这里插入图片描述

    • 访问地址http://eureka7002.com:7002
      在这里插入图片描述

  8. 两服务注册进集群

    1. 修改支付服务8001application.yml

      #集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      
    2. 订单服务80修改application.yml

      #集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      
    3. 启动,测试

      • 访问地址http://eureka7001.com:7001
        在这里插入图片描述

      • 访问地址http://eureka7002.com:7002
        在这里插入图片描述

      • get数据

        发送:http://localhost:80/consumer/payment/get/1

        返回:{"code":200,"message":"查询成功","data":{"id":1,"serial":"123456"}}

  9. 提供者8001集群搭建

    1. 子模块名称

      cloud-provider-payment8002

    2. pom依赖

      <dependencies>
          <!--eureka-client-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
          </dependency>
          <dependency><!-- 引入自己定义的api-->
              <groupId>com.naclo</groupId>
              <artifactId>cloud-api-commons</artifactId>
              <version>${project.version}</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.mybatis.spring.boot</groupId>
              <artifactId>mybatis-spring-boot-starter</artifactId>
          </dependency>
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid-spring-boot-starter</artifactId>
              <version>1.1.10</version>
          </dependency>
          <!--mysql-connector-java-->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
          </dependency>
          <!--jdbc-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-jdbc</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>
      
    3. 创建application.yml

      server:
        port: 8002
      
      spring:
        application:
          name: cloud-provider-payment
        datasource:
          type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
          driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
          url: jdbc:mysql://localhost:3306/springcloudstudy?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8
          username: root
          password: root
      
      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
      
      mybatis:
        mapperLocations: classpath:mapper/*.xml
        type-aliases-package: com.naclo.entities    # 所有Entity别名类所在包
      
    4. 创建主启动类PaymentMain8002

      @SpringBootApplication
      @EnableEurekaClient
      public class PaymentMain8002 {
          public static void main(String[] args) {
              SpringApplication.run(PaymentMain8002.class, args);
          }
      }
      
    5. 拷贝其他文件 mapper,dao,service,controller

    6. 修改8001/8002的controller,添加

      @Value("${server.port}")
      private String serverPort;
      
    7. 启动测试

      • 访问地址http://eureka7001.com:7001
        在这里插入图片描述
    8. 修改controller地址为服务名称

      public static final String PAYMENT_URL = "http://CLOUD-PROVIDER-PAYMENT";
      
    9. RestTemplate添加@LoadBalanced注解,启用负载均衡

      @Configuration
      public class ApplicationContextConfig {
          @Bean
          @LoadBalanced
          public RestTemplate getRestTemplate() {
              return new RestTemplate();
          }
      }
      
    10. 启动,测试

      get数据

      发送:http://localhost:80/consumer/payment/get/1

      返回:{"code":200,"message":"查询成功,serverPort:8002","data":{"id":1,"serial":"123456"}}

      或者{"code":200,"message":"查询成功,serverPort:8001","data":{"id":1,"serial":"123456"}}

    11. 修改服务名称,修改application.yml添加

      eureka:
        instance:
          instance-id: payment8002
      

      在这里插入图片描述

    12. 显示IP地址,修改application.yml添加

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

开启服务注册与发现

  1. 在主启动类PaymentMain8001添加注解@EnableDiscoveryClient

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class PaymentMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class, args);
        }
    }
    
  2. 修改controller

    @Resource
    DiscoveryClient discoveryClient;
    
    @GetMapping(value = "/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 this.discoveryClient;
    }
    
  3. 测试

    • 访问http://localhost:8001/payment/discovery
      在这里插入图片描述

自我保护

  1. 现象
    在这里插入图片描述

  2. 原因

    • 某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对微服务的信息进行保存。
  3. 禁止自我保护

    1. 修改7001的application.yml添加

      eureka:
        server:
          #关闭自我保护机制,保证不可用服务被及时删除
          enable-self-preservation: false
          eviction-interval-timer-in-ms: 2000
      
    2. 启动,测试
      在这里插入图片描述

    3. 修改8001的application.yml添加

      eureka:
        instance:
          #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
          lease-renewal-interval-in-seconds: 1
          #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
          lease-expiration-duration-in-seconds: 2
      
    4. 启动,测试:8001可以成功入驻7001
      在这里插入图片描述

    5. 8001尝试测试出故障,关闭8001,服务两秒之后消失
      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24191395/article/details/106934603