• 【SpringCloud】服务注册与发现(01)-Eureka


    语雀地址:语雀pojo123

    7.1项目初始化

    Spring创建父工程方式:
    1. 通过maven模板进行创建项目
    2. 整理环境
      1. 进入setting-File Encoding,调整字符编码![image.png](https://img-blog.csdnimg.cn/img_convert/8b605c928c082526cbbc43cd28af3a98.png#clientId=u9e8562e3-b96c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=892&id=u18182ce6&margin=[object Object]&name=image.png&originHeight=892&originWidth=1217&originalType=binary&ratio=1&rotation=0&showTitle=false&size=64336&status=done&style=none&taskId=u063f297d-9551-4a49-a0e6-39de021fdca&title=&width=1217)
      2. 开启支持注解setting-Build-Anotations Processors:![image.png](https://img-blog.csdnimg.cn/img_convert/912c44401e2b8b7677544091a7c7020a.png#clientId=u9e8562e3-b96c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=900&id=u64d97020&margin=[object Object]&name=image.png&originHeight=900&originWidth=1245&originalType=binary&ratio=1&rotation=0&showTitle=false&size=86978&status=done&style=none&taskId=ud02822d8-c4de-4f64-8f21-ed4fcf549e9&title=&width=1245)
      3. 设置java编译![image.png](https://img-blog.csdnimg.cn/img_convert/a2ce51d69dbb68a4659512ee7df0eba0.png#clientId=u9e8562e3-b96c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=900&id=ue53d8ab4&margin=[object Object]&name=image.png&originHeight=900&originWidth=1245&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82627&status=done&style=none&taskId=u6fd0e02d-e7e7-4afe-8ab1-9df0c3aaf3e&title=&width=1245)

    dependencyManagement和dependies的区别

    Maven通常使用dependencyManagement来执行版本号,只是声明依赖,并不实现引入,因此子项目要显示的声明需要引用的依赖
    好处是:多个子项目都引用同样的依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样在后续需要升级或者切换到另一个版本的时候,只需要在父容器里更新,而不需要在一个一个子项目的修改;另外如果某个子项目需要另外一个版本的时候,只需要声明version即可;

    maven中跳过单元测试:

    使用maven项目中闪电的图标进行操作,即可跳过test测试
    ![image.png](https://img-blog.csdnimg.cn/img_convert/00630cda20bbf787e297f859abcf9cf5.png#clientId=u02c7cee7-aa5d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=284&id=u757190e2&margin=[object Object]&name=image.png&originHeight=284&originWidth=264&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8999&status=done&style=none&taskId=u4aea6ddc-a936-4c11-8844-05d78e91c3a&title=&width=264)
    完成执行mvn:instal将父工程发布到仓库方便子工程继承

    7.2Rest微服务工程构建

    消费者80端口通过订单操作调用8001的支付模块
    ![image.png](https://img-blog.csdnimg.cn/img_convert/c1fc84d08aa05072f39f6321dc32349f.png#clientId=u588545a1-30dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=203&id=u1c036700&margin=[object Object]&name=image.png&originHeight=343&originWidth=973&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56105&status=done&style=none&taskId=ub6526238-1cb4-4e74-8031-0b4da0c6263&title=&width=575)
    流程:

    1. 建module
    2. 改pom
    3. 写yaml
    4. 主启动
    5. 业务类
      1. 建表SQL
      2. entities
      3. dao
      4. service
      5. controller
    6. 测试

    热部署
    1. Adding devtools to your project
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. Adding plugin to your pom.xml(父工程)
    <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <fork>true</fork>
              <addResources>true</addResources>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. Enabling automatic build (开启自动构建)

    ![image.png](https://img-blog.csdnimg.cn/img_convert/15dc6f1365239426e0a3684917b39733.png#clientId=u588545a1-30dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=585&id=ud273a974&margin=[object Object]&name=image.png&originHeight=700&originWidth=722&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44589&status=done&style=none&taskId=ufc9c765f-c2ed-4981-97f2-ff9d4084c44&title=&width=603)

    1. update the value of:

    Ctrl+Alt+Shift+/ 进入Rigistry进行下列配置,
    ![image.png](https://img-blog.csdnimg.cn/img_convert/51df2888746566359e75c7313375a982.png#clientId=u588545a1-30dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=82&id=u32bc2792&margin=[object Object]&name=image.png&originHeight=82&originWidth=727&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5032&status=done&style=none&taskId=u5645f579-e851-449e-af31-3594da9c8c7&title=&width=727)

    1. 重启IDEA

    RestTemplate:

    RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的resful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
    使用restTemplate访问resful接口非常简单粗暴。(url,requestMap,ResponseBean.class)这三个对象分别代表REST请求地址,请求参数,HTTP响应转换成的对象类型

    工程重构

    系统中有重复的部分,将其重构

    1. 新建module
    2. 修改pom文件
    3. 新增公共entities
    4. maven命令clean install,将其打包放到本地maven仓库给其它服务使用
    5. 删除项目原先有过的entities 文件夹
    6. 引入仓库中之前打包好的文件
    <!--        引入自己定义的api通用包,可以使用payment-->
    <dependency>
        <groupId>com.pojo123.cloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    服务注册与发现

    在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册;

    Eureka服务注册与发现

    Eureka的两个组件

    Eureka提供服务注册服务:
    各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

    Eureka通过注册中心访问:
    是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90s);

    Eureka服务端安装:
    1. IDEA生成EurekaServerdaunt服务注册中心
      1. 建module
      2. 改pom

    在服务项目的pom文件中加入以下服务依赖

    <!--        eureka-server-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 写yml
    server:
      port: 7001
    
    eureka:
      instance:
        hostname: localhost #eureka服务端实例名称
      client:
        register-with-eureka: false # 不允许向注册中心注册自己
        fetch-registry: false #表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
        service-url:
          #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 主启动

    在主启动类中加入@EnableEurekaServer注解,表明这里是一个Eureka的服务中心

    1. 测试

    2. 将支付服务8001注册到服务中心

      1. 改pom文件

    在pom文件中加入以下eureka的客户端依赖;

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

    b. 修改yml文件

    eureka:
      client:
        #表示是否将自己注册金EurekaServer,默认为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

    c. 在主启动文件中加入@EnableEurekaClient注解

    1. 将消费者服务8080注册进EurekaServer称为服务消费者

    和上述一样

    构建集群Euraka
    支付服务启动后会把自身信息(比如服务地址以别名的方式注册进eureka),消费者order服务在需要调用接口的时候,使用服务别名去注册中心获取实际的RPC远程调用地址,消费者获取调用地址以后,底层实际上是利用HttpClient技术实现远程调用,消费者获取服务地址后悔缓存在本地JVM内存中,默认每隔30s更新一次服务调用地址;<br />**互相注册,相互守望**
    
    • 1

    Eureka集群环境构建步骤
    1. 仿照7001EurekaServer新建7002EurekaServer
    2. 添加映射配置到hosts文件
    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com
    
    • 1
    • 2
    1. 修改yml文件,相互注册,仿照7001,如下所示
    server:
    port: 7001
    
    eureka:
    instance:
    hostname: eureka7001.com #eureka服务端实例名称
    client:
    register-with-eureka: false # 不允许向注册中心注册自己
    fetch-registry: false #表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
    service-url:
    #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://eureka7002.com:7002/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 将支付服务8001微服务发布到上面两台Eureka集群配置中
    2. 将订单服务8080微服务发布到上面两台Eureka集群配置中

    修改两个服务的application.yml文件,如下所示,将服务地址改为集群中的两个地址

    eureka:
      client:
        #表示是否将自己注册金EurekaServer,默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的自己的注册信息,默认为true,单节点无所谓,集群必须先设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
    #      defaultZone: http://localhost:7001/eureka
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 支付服务提供者8001集群环境构建
      1. 参考8001服务提供新建服务
    2. 负载均衡

    使用@LoadBalanced注解赋予RestTemplate负载均衡的能力,在config的RestTemplate配置中加上此注解

    actuator微服务信息完善

    主机名称:服务名称修改

    instance:
    instance-id: payment8001
    修改后暴露的服务名称发生变化
    ![image.png](https://img-blog.csdnimg.cn/img_convert/0db99df97e656614e468d954aad8ef18.png#clientId=u588545a1-30dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=84&id=ua05b601f&margin=[object Object]&name=image.png&originHeight=84&originWidth=1338&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14877&status=done&style=none&taskId=u299bebeb-b5f6-467b-9371-4623221d3cc&title=&width=1338)

    访问信息有IP信息提示

    instance:
    instance-id: payment8001
    prefer-ip-address: **true **#访问路径可以显式IP地址
    修改后点击路径有ip地址显示
    ![image.png](https://img-blog.csdnimg.cn/img_convert/ee8d990220f396986efcde4da91962a3.png#clientId=u588545a1-30dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=543&id=udf5546ab&margin=[object Object]&name=image.png&originHeight=543&originWidth=1340&originalType=binary&ratio=1&rotation=0&showTitle=false&size=78519&status=done&style=none&taskId=u68f63fb8-5f44-4c04-a2df-7fa6a4823ea&title=&width=1340)

    服务发现Discovery

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

    1. 用8001进行实验,编写接口,进行自测
    @GetMapping(value="/payment/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();//获取当前服务列表信息
        for (String service : services) {
            log.info("serivce"+service);
            
        }
        
        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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 在启动类上加入@EnableDiscoveryClient 注解

    Eureka的自我保护

    什么是自我保护

    保护模式是用于一组客户端和Eureka Server之间存在网路分区场景下的保护,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务;
    就是说:某时刻某一个服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存;

    属于CAP里面的AP分支
    ![image.png](https://img-blog.csdnimg.cn/img_convert/36edb5d70248751b9779bca56e10a595.png#clientId=uc4cd1fec-664b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=613&id=u05a82e2a&margin=[object Object]&name=image.png&originHeight=613&originWidth=1081&originalType=binary&ratio=1&rotation=0&showTitle=false&size=470811&status=done&style=none&taskId=u7d59400d-35d1-41a4-8bfb-da25b0e6916&title=&width=1081)

    如何关闭自我保护

    在server方配置文件中添加以下配置

    eureka:
        server:
        #关闭自我保护机制,保证不可用服务及时被踢出
        enable-self-preservation:false
        eviction-interval-timer-in-ms:2000 #设置心跳时间为2s
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在client方配置文件添加以下配置

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

    Eureka2.0之后停更;

  • 相关阅读:
    torch.from_numpy()函数(pytorch版)
    java webservice超时时间设置方法
    STL容器之list类
    【云原生】K8s pod优雅退出(postStart、terminationGracePeriodSeconds、preStop)
    ArcGIS模型构建器ModelBuilder的使用方法
    阶段性总结:跨时钟域同步处理
    STL笔记
    【06】基础知识:typescript中的泛型
    正点原子linux应用编程——入门篇1
    右旋酮洛芬-β-环糊精微球|聚苹果酸-羟喜树碱前药(PMLA-HCPT)|Gd2O3/CuS复合白蛋白纳米粒(科研级)
  • 原文地址:https://blog.csdn.net/weixin_47418550/article/details/125610377