栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

语雀地址:语雀pojo123

目录
        • 7.1项目初始化
            • Spring创建父工程方式:
            • dependencyManagement和dependies的区别
            • maven中跳过单元测试:
        • 7.2Rest微服务工程构建
            • 热部署
            • RestTemplate:
            • 工程重构
        • 服务注册与发现
          • Eureka服务注册与发现
            • Eureka的两个组件
            • Eureka服务端安装:
          • 构建集群Euraka
            • Eureka集群环境构建步骤
          • actuator微服务信息完善
            • 主机名称:服务名称修改
            • 访问信息有IP信息提示
          • 服务发现Discovery
          • Eureka的自我保护
            • 什么是自我保护
            • 如何关闭自我保护

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

  org.springframework.boot
  spring-boot-devtools
  runtime
  true

  1. Adding plugin to your pom.xml(父工程)

    
      
        org.springframework.boot
        spring-boot-maven-plugin
        
          true
          true
        
      
    
  
  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. 引入仓库中之前打包好的文件


    com.pojo123.cloud
    cloud-api-commons
    1.0-SNAPSHOT

服务注册与发现

在传统的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文件中加入以下服务依赖


        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
  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. 主启动

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

  1. 测试

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

    1. 改pom文件

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


        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

b. 修改yml文件

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

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

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

和上述一样

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

Eureka集群环境构建步骤
  1. 仿照7001EurekaServer新建7002EurekaServer
  2. 添加映射配置到hosts文件
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
  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. 将支付服务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. 支付服务提供者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 services = discoveryClient.getServices();//获取当前服务列表信息
    for (String service : services) {
        log.info("serivce"+service);
        
    }
    
    List 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. 在启动类上加入@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
    

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

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

Eureka2.0之后停更;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006440.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号