• Spring-Cloud-Eureka-01


    springCloud和SpringBoot是配套的,不是所有的依赖都可以使用的,需要去官网查看相应的依赖搭配,演示使用的依赖版本是springBoot:2.3.12RELEASE springCloud:Hoxton.SR12

    1、Eureka服务注册于发现

    以下图片显示为eureka-cli-01和eureka-cli-02后期均改为eureka-cli-a和eureka-cli-b

    1、快速使用

    1.1、开启一个简单的Eureka服务
    1. 创建一个springBoot项目,前面步骤都一样,最后导入依赖如下

      在这里插入图片描述

    2. 创建完成后,我们打开pom.xml配置文件修改版本

      在这里插入图片描述

    3. 修改完成后我们去application.yml配置文件里面进行配置

      #v  eureka 默认端口号
      server:
        port: 8761
      
      # 应用名称
      spring:
        application:
          name: eureka-server
      
    4. 配置完成后,我们最后在启动类上加上注解@EnableEurekaServer就可以了

    5. 然后我们启动项目,然后就可以在控制台看到启动成功信息

      在这里插入图片描述

    6. 最后我们打开浏览器,访问http://localhost:8761就可以看到服务注册了

      在这里插入图片描述

    1.2、注册一个简单的Eureka客户端
    1. 也是创建一个SpringBoot项目,但是依赖导入的需要修改

      在这里插入图片描述

    2. 创建完成后和服务端一样,手动修改下pom.xml的springboot和springcloud依赖

    3. 修改完成后,我们去application.yml配置文件进行配置

      server:
        port: 8080 # 客户端 端口号没有约束
      
      spring:
        application:
          name: eureka-cli-a
      
      # 注册的含义就是将自己的一些信息发送过去,发送到指定地址
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8761/eureka
      
    4. 修改完配置文件后,在启动类增加注解@EnableEurekaClient注解,然后启动项目。

    5. 启动完成后,我们刷新服务端的页面,然后就可以看到会多出来一个服务

      在这里插入图片描述

    6. 我们使用相同的方法,再搭建一个客户端方便后面测试

      在这里插入图片描述

    2、搭建客户端集群

    让a这个cli起两台,就是搭建个集群操作

    2.1、方法一:再创建一个项目,然后再配置文件修改端口号(项目名称和地址不修改),步骤太简单,就不操作了

    2.2、方法二:复制配置文件,然后启动的时候修改端口号

    1. 在这里插入图片描述

    2. 在这里插入图片描述

    3. 在这里插入图片描述

    4. 在这里插入图片描述

    5. 修改完后,我们点击Apply,然后启动这个配置文件

      在这里插入图片描述

    6. 启动完成后,我们再次刷新页面,就可以看到我们新添加的客户端了

      在这里插入图片描述

    3、Eureka配置端文件讲解

    3.1、eureka-server端配置文件讲解

    eureka的配置分为三类:server client 实例的

    server端 server 和 实例的配置

    #  eureka 默认端口号
    server:
      port: 8761
    
    # 应用名称 不要使用特殊字符
    spring:
      application:
        name: eureka-server
    
    
    eureka:
      server:
        eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
        renewal-percent-threshold: 0.85 #续约百分比,超过85%的应用没有和你续约,那么eureka会保护服务 不会剔除任何客户端
      instance:
        hostname: localhost #主机名称 或者服务的ip
        # 主机名称 : 应用名称 : 端口号
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        prefer-ip-address: true # 以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 5 #服务实例的续约时间
    
    
    1. 配置完成后,我们关闭所有服务,然后启动当前服务

    2. 启动完成后,我们刷新页面,查看我们配置的结果

      在这里插入图片描述

    3.2、eureka-cli端配置文件讲解

    客户端 client 和 实例的配置

    server:
      port: 8080 # 客户端 端口号没有约束
    
    spring:
      application:
        name: eureka-cli-a
    
    eureka:
      client:
        service-url: # 指定注册的地址
          defaultZone: http://localhost:8761/eureka
        register-with-eureka: true # 可以不往Eureka注册
        fetch-registry: true # 应用是否去拉取服务列表到本地
        registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少  性能消耗大
      instance:
        hostname: localhost
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        prefer-ip-address: true # 显示ip
        lease-renewal-interval-in-seconds: 10 # 实例续约的时间
    
    1. 配置完成后,启动项目,然后刷新页面,查看效果

      在这里插入图片描述

    2、搭建Eureka-server集群

    • 去中心化模式集群中没有主从的概念

    • eureka会将数据进行广播和扩散

    2.1、方法一

    在搭建之前,我们要先理解,Eureka服务端,其实就是一个可以让别人注册的客户端,自己也可以注册自己

    1. 创建三个Eureka-server项目

      在这里插入图片描述

    2. 创建的步骤全部都和第一个一样,创建springboot项目,引入Eureka Server依赖,启动类加上@EnableEurekaServer注解

    3. 创建好后,我们开始一个一个修改配置文件

      1. eureka-server的配置文件

        #  eureka 默认端口号
        server:
          port: 8761
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        eureka:
          client:
            service-url:
              defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka
          instance:
            hostname: localhost #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
      2. 另外两个和这个差不多,只不过把端口 和 defaultZone的值修改一下

      3. eureka-server-b的配置文件

        #  eureka 默认端口号
        server:
          port: 8762
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        eureka:
          client:
            service-url:
              defaultZone: http://localhost:8761/eureka,http://localhost:8763/eureka
          instance:
            hostname: localhost #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
      4. eureka-server-c的配置文件

        #  eureka 默认端口号
        server:
          port: 8763
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        
        eureka:
          client:
            service-url:
              defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
          instance:
            hostname: localhost #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
    4. 修改完配置文件后,我们依次启动项目,控制台会报错,不用管。

    5. 启动完成后,我们访问http://localhost:8761http://localhost:8762http://localhost:8763

    6. 都可以看到相同的页面

      在这里插入图片描述

    7. 但是这样并没有搭建成功,因为三个服务都是使用的localhost端口的,所以他默认会把三个服务都合为一个副本,就是DS Replicas里面的值。

    8. 我们想要在一台电脑上搭建成功,可以这样。

    9. 打开运行窗口(win+r),输入drivers打开文件夹,然后进入etc目录,对hosts文件进行编辑

    10. 在文件末尾,添加如下三行,然后保存

      127.0.0.1 peer1
      127.0.0.1 peer2
      127.0.0.1 peer3
      
    11. 保存完毕后,我们再次修改三个服务的配置文件

      1. eureka-serve配置文件

        #  eureka 默认端口号
        server:
          port: 8761
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        eureka:
          client:
            service-url:
              defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
          instance:
            hostname: peer1 #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
      2. eureka-serve-b配置文件

        #  eureka 默认端口号
        server:
          port: 8762
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        eureka:
          client:
            service-url:
              defaultZone: http://peer1:8761/eureka,http://peer3:8763/eureka
          instance:
            hostname: peer2 #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
      3. eureka-serve-c配置文件

        #  eureka 默认端口号
        server:
          port: 8763
        
        # 应用名称 不要使用特殊字符
        spring:
          application:
            name: eureka-server
        
        
        eureka:
          client:
            service-url:
              defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka
          instance:
            hostname: peer3 #主机名称 或者服务的ip
            instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        
    12. 修改完成后,我们再次重启项目(要先关闭,再启动),然后刷新页面可以看到如下结果

      1. http://localhost:8761/页面

        在这里插入图片描述

      2. http://localhost:8762/页面

        在这里插入图片描述

      3. http://localhost:8763/页面

        在这里插入图片描述

    13. 到此,我们的集群才算是搭建完成,集群搭建完成后,我们把一个服务注册上去,服务的配置类也需要修改,改成如下

      server:
        port: 8080
      
      spring:
        application:
          name: eureka-cli
      
      eureka:
        client:
          service-url:
            defaultZone: http://peer1:8761/eureka
          register-with-eureka: true
          fetch-registry: true
          registry-fetch-interval-seconds: 10
        instance:
          hostname: localhost
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
          prefer-ip-address: true
          lease-renewal-interval-in-seconds: 10
      
    14. 因为我们设置了集群,所以理论上来说,只要给一个服务注册了,其他服务也应该有的

    15. 配置完毕,重启后,刷新三个页面,查看服务是否都注册成功

      在这里插入图片描述

    2.2、方法二

    因为我们都是在一台电脑上起的,所以可以复制配置文件,修改端口号,起三台就可以了,步骤如下

    1. 关闭所有启动的项目,打开eureka-server的配置文件,修改如下

      #  eureka 默认端口号
      server:
        port: 8761
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        client:
          service-url:
            defaultZone: http://peer1:8762/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
        instance:
      #    hostname: peer1 #主机名称 或者服务的ip
          instance-id: ${spring.application.name}:${server.port}
          prefer-ip-address: true
          lease-renewal-interval-in-seconds: 5
      
    2. 然后我们点击idea右上角配置,打开启动项配置

      在这里插入图片描述

    3. 我们选中左侧的第一个服务,然后点击复制,改名,改端口,依次启动就可以了

      在这里插入图片描述

    4. 在这里插入图片描述

    5. 刷新页面,查看结果

      在这里插入图片描述

    3、Eureka概念理解

    3.1、服务的注册

    当项目启动时(eureka的客户端),就会向eureka-server发送自己的元数据(原始数据)(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul,请求风格),eureka-server 会在自己内部保留这些元数据(内存中)。(有一个服务列表,使用的是ConcurrentHashMap集合存放注册的服务)以restful风格,以http动词的请求方式,完成对url资源的操作。

    3.2、服务的续约

    项目启动成功了,除了向eureka-server注册自己成功,还会定时的向eureka-server汇报自己,心跳,表示自己还活着。(修改一个时间)

    3.3、服务的下线(主动下线)

    当项目关闭时,会给eureka-server报告,说明自己要下机了。

    3.4、服务的剔除(被动下线,主动剔除)

    当项目超过了指定时间没有向eureka-server汇报自己,那么eureka-server就会认为此节点死掉了.会把它剔除掉,也不会放流量和请求到此节点了.

    3.5、Eureka运作原理的特点

    Eureka-server对外提供的是restfu1风格的服务

    以http动词的形式对url资源进行操作get post put delete

    http服务+特定的请求方式+特定的ur1地址

    只要利用这些restful我们就能对项目实现注册和发现

    只不过,eureka已经帮我们使用java语言写了client,让我们的项目只要依赖client 就能实现注册和发现!

    只要你会发起Http请求,那你就有可能自己实现服务的注册和发现。不管你是什么语言!

    4、服务发现

    通过服务的应用名称找到服务的具体实例的过程

    1. 所有开启的应用全部关闭,我们实现在客户端a中获取客户端b的信息

    2. 因为我们想要在一个客户端上调用另一个客户端的接口,所以要先获取客户端b的ip和端口,所以我们这次只需要开启一个服务,两个客户端即可,所以我们把服务端的配置文件改为原来的

      #  eureka 默认端口号
      server:
        port: 8761
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        server:
          eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
          renewal-percent-threshold: 0.85 #续约百分比,超过85%的应用没有和你续约,那么eureka会保护服务 不会剔除任何客户端
        instance:
          hostname: localhost #主机名称 或者服务的ip
          # 主机名称 : 应用名称 : 端口号
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
          prefer-ip-address: true # 以ip的形式显示具体的服务信息
          lease-renewal-interval-in-seconds: 5 #服务实例的续约时间
      
      
    3. 改完后启动服务,然后再把客户端b的配置文件修改回来,然后启动

      server:
        port: 8081 # 客户端 端口号没有约束
      
      spring:
        application:
          name: eureka-cli-b
      
      eureka:
        client:
          service-url: # 指定注册的地址
            defaultZone: http://localhost:8761/eureka
          register-with-eureka: true # 可以不往Eureka注册
          fetch-registry: true # 应用是否去拉取服务列表到本地
          registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少  性能消耗大
        instance:
          hostname: localhost
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
          prefer-ip-address: true # 显示ip
          lease-renewal-interval-in-seconds: 10 # 实例续约的时间
      
    4. 启动成功后,刷新网页,查看是否注册成功

      在这里插入图片描述

    5. 注册成功后,我们把eureka-cli-a项目的配置文件,修改为和上面的一样,修改一下端口号和应用名称即可

      在这里插入图片描述

    6. 修改完成后,我们创建一个DiscoveryController编写代码

      package com.tcc.controller;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.cloud.client.ServiceInstance;
      import org.springframework.cloud.client.discovery.DiscoveryClient;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      import java.util.List;
      
      /**
       * @author 宇辰
       * @date 2022/8/7 - 20:43
       **/
      @RestController
      public class DiscoveryController {
      
          @Autowired
          private DiscoveryClient discoveryClient; // springCloud定义的接口
      
          @GetMapping("test")
          public String doDiscovery(String serviceName){
              // 通过服务的应用名,找到服务的具体信息
              List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
              instances.forEach(System.out::println);
      
              ServiceInstance serviceInstance = instances.get(0);
              String ip = serviceInstance.getHost();
              int port = serviceInstance.getPort();
              System.out.println(ip+":"+port);
      
              // 这里去找客户端02的ip和port
              return instances.get(0).toString();
      
          }
      
      }
      
    7. 编写完毕后,启动eureka-cli项目,然后在页面路径上调用接口,查看返回值,路径为http://localhost:8080/test?serviceName=eureka-cli-b

    8. 传过去的参数为b的客户端的接口,可以在服务端的页面内找到

      在这里插入图片描述

    9. 访问完毕后,查看返回值,是否为b的信息

      在这里插入图片描述

    10. 然后我们查看控制台的打印,是否获取成功

      在这里插入图片描述

    11. 有了地址和端口号,我们只需要知道接口就可以调用其他项目的接口了。

    5、通过RestTemplet类发送http请求调用接口(下一章ribbon使用)

    我们先新建一个restTemplet项目,引入web依赖和lombok依赖,项目端口为9090

    1. 我们先在创建个controller,然后创建几个测试接口

      package com.tcc.controller;
      
      
      import com.tcc.entity.User;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RequestBody;
      import org.springframework.web.bind.annotation.RestController;
      
      /**
       * @author 宇辰
       * @date 2022/8/8 - 8:58
       **/
      @RestController
      public class TestController {
      
          @GetMapping("testGet")
          public String testGet(String name){
              System.out.println(name);
              return "OK";
          }
      
          /**
           * post传参,两种
           * json参数的核心    header content-type = application/json;charset=utf-8
           *
           * @param user
           * @return
           */
          @PostMapping("testPost1")
          public String testPost1(@RequestBody User user){
              return "姓名;" + user.getName() + ",年龄:" + user.getAge() + ",工资:" + user.getWages();
          }
      
          /**
           * 接收表单参数
           * 
      @PostMapping("testPost2") public String testPost2(User user){ return "姓名;" + user.getName() + ",年龄:" + user.getAge() + ",工资:" + user.getWages(); } } /** * 导入lombok依赖 内部类,也可以单独创建一个类 **/ @Data @AllArgsConstructor @NoArgsConstructor @Builder class User{ private String name; private Integer age; private Double wages; }
    2. 创建完毕后,我们随便找个地方创建测试类,进行测试

      1. new RestTemplet创建一个发送请求的类

      2. 然后定义参数

      3. 获取返回值并打印

        • 发送get请求

          // 发送get请求
          String url = "http://localhost:9090/testGet?name=张三";
          String getTemplate = restTemplate.getForObject(url, String.class);
          System.out.println(getTemplate);
          

          在这里插入图片描述

        • 发送post请求

          String url = "http://localhost:9090/testPost1";
          User user = User.builder()
              .name("张三")
              .age(20)
              .wages(20D).build();
          String postForObject = restTemplate.postForObject(url, user, String.class);
          System.out.println(postForObject);
          

          在这里插入图片描述

        • 发送表单请求

          // 发送表单请求
          String url = "http://localhost:9090/testPost2";
          LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
          map.add("name","李四");
          map.add("age",22);
          map.add("wages",200D);
          
          String postForObject = restTemplate.postForObject(url, map, String.class);
          System.out.println(postForObject);
          

          在这里插入图片描述

  • 相关阅读:
    Linux下的网络设备驱动
    Zookeeper 集群安装部署
    Rabbitmq小书
    这就是跨域吧(个人理解)
    mac版Idea快捷键
    服务双管齐下,智能语音机器人帮你say hi~
    矢量绘图软件Sketch 99 for mac
    小程序分包和基础页面创建
    渗透测试CTF-流量分析
    Linux 定时删除7天前的文件
  • 原文地址:https://blog.csdn.net/qq_57404736/article/details/127038553