【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. 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. 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>

服务注册与发现

在传统的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. 写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的客户端依赖;

<!--        eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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更新一次服务调用地址;<br />**互相注册,相互守望**

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<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. 在启动类上加入@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之后停更;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PoJo123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值