前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springcloud:Eureka服务注册与发现

Springcloud:Eureka服务注册与发现

作者头像
冷环渊
发布2021-10-19 15:28:24
4340
发布2021-10-19 15:28:24
举报

springcloud

学习课程来自尚硅谷,内容图片均为笔记脑图中的技术点配图 笔记内容和个人总结均为学习视屏课程,结合自我思想编写的

Eureka服务注册与发现

什么是服务治理 springcloud 封装了netflix的Eureka模块实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂所以需要有一个东西去治理他,管理服务与服务之间的依赖关系,负载均衡,容错等 实现服务发现与注册

这个是有人要问了:什么时服务的注册与发现呢??? 问得好,

答案: Eureka采用了CS也就是服务器和客户端的架构模式,Eureka Server作为服务注册中心,来管理微服务,也可以理解成用springboot来开发的一个个微服务,他们在Eureka的位置就是Eureka client,他们用心跳来告诉服务端自己是可以用的 我们可以用Eureka server就可以监控各个微服务的状态,同时也有一系列的保证机制,比如心跳检测, 我们的服务提供者和消费者的例子就是这样的, 服务提供者:在启动后将把自己当前的信息,通讯地址等以别名的方式注册到注册中心也就是Eureka server中 消费者:用别名的的形式,去获取服务的信息和通讯地址,之后实现本地调用RPC调用框架的设计思想 注册中心负责管理服务之间的依赖关系(服务治理),在任何的远程RPC中都会有一个注册中心,通过注册中心来获取服务的信息和接口地址

在这里插入图片描述
在这里插入图片描述

下图是脑图中对于Eureka两大组件的作用和功能介绍

  • Eureka server
  • Eureka client
在这里插入图片描述
在这里插入图片描述

单项目Eurekademo

老步骤:

  • 建模块
  • 添加依赖pom
  • yml配置文件
  • 主启动类
  • 业务编码

创建cloud-eureka-server7001模块

之后导入我们要用到的依赖

代码语言:javascript
复制
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        
            com.atguigu.springcloud
            cloud-api-commons
            ${project.version}
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.springframework.boot
            spring-boot-starter-actuator
        

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

        
        
            org.projectlombok
            lombok
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            junit
            junit

这里Eureka的服务端新老版本也有变化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4kr6gqv-1629388556733)(springcloud.assets/image-20210819225527988.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4kr6gqv-1629388556733)(springcloud.assets/image-20210819225527988.png)]

之后就是配置了yml

代码语言:javascript
复制
server:
  port: 7001

eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表识不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
     service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

之后的主启动类的编写

代码语言:javascript
复制
package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

@EnableEurekaServer加上个注解就是Eureka的服务端了,我们并不需要写什么业务员,启动之后访问

7001端口就可以看道Eureka的注册中心啦

在这里插入图片描述
在这里插入图片描述

服务的注册

cloud-provider-payment8001我们的目光回到服务提供者

Eurekashi1 C/S架构 所以我们想要将服务提供者注册道服务中心,还需要导入一个依赖,就是Eureka client的依赖抱

代码语言:javascript
复制
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
在这里插入图片描述
在这里插入图片描述

之后就是配置文件了

代码语言:javascript
复制
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

配置解读:

  1. register-with-eureka:true 表示自己会被注册到服务中心
  2. fetchRegistry:true表示自己不是服务中心,需要检索服务
  3. defaultZone要注册的服务中心的地址

主启动类

代码语言:javascript
复制
package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

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

@EnableEurekaClient表示自己的客户端,

之后就是测试了

  1. 先启动注册中心
  2. 之后启动需要注册的注册中心
  3. 访问注册中心即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50qe9OoR-1629388556737)(springcloud.assets/image-20210819232956305.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50qe9OoR-1629388556737)(springcloud.assets/image-20210819232956305.png)]

微服务名称配置

Eureka的自我保护机制

出厂默认,自我保护机制是开启的

eureka.server.enable-self-preservation = true

我们可以禁用

代码语言:javascript
复制
server:
  enable-self-preservation: false
  eviction-interval-timer-in-ms: 2000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当Eureka一定时间内没有检测到服务的心跳或者短时间内丢失了多个服务,那么服务端就会认为是网络故障或者是一系列i意外的发生

此时不应该注销任何的服务。同时新的服务也可以继续进来,

设计哲学 好死不如赖活着 Eureka宁可保护错误的服务信息,也不会去轻易的注销服务

在这里插入图片描述
在这里插入图片描述

小测试

我们在8001的配置文件中追加一些配置

在这里插入图片描述
在这里插入图片描述

启动项目之后

过五秒关闭8001

你会发现两秒就消失了

配置生效

Eureka集群原理

Eureka集群原理说明:

在这里插入图片描述
在这里插入图片描述
搭建注册中心集群

参考我们的注册中心7001,搭建一个一模一样的注册中心

在搭建之前请去修改一下映射文件,

找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改

因为我们之前使用都是一个单机的项目,我们要集群那么不能使用 localhost,他会被识别成一样的路径

我们修改一些映射

如:

  1. 127.0.0.1 eureka7001.com
  2. 127.0.0.1 eureka7002.com

本质还是localhost但是却是两个不一样的映射

导入和7001相同的依赖

之后分别修改

7001配置文件

代码语言:javascript
复制
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com    #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表识不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/    #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

7002

代码语言:javascript
复制
server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表识不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/     #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

集群其实就是一句话:相互守望,

之后我们还要修改一下 服务提供者 8001的注册地址,他现在同时需要注册到两个注册中心去

代码语言:javascript
复制
service-url:
  defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版

测试:

  1. 先要启动EurekaServer,7001/7002服务
  2. 再要启动服务提供者provider,8001服务
  3. 再要启动消费者,80
  4. http://localhost/consumer/payment/get/1

**注意:**记得修改服务的端口号,避免两个模块都是用7001导致服务异常

查看结果即可

支付服务提供者8001集群环境构建

同上搭建一个除了端口号和8001一抹一样的模块

cloud-provider-payment8002

配置文件修改一个端口号即可

之后修改业务代码

因为是集群,所以之后我们要做负载均衡

我们需要修改接口业务代码

8001:

在这里插入图片描述
在这里插入图片描述

8002同上

我们通过获取不同配置文件中的端口号来判断调用的是哪一个模块

之后去修改消费者80的业务代码

= 订单服务访问地址不能写死 =

改成我们的服务提供者集群的服务别名

代码语言:javascript
复制
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

PS:一定要修改,不然无法实现负载均衡,

之后去给config中的resttemplate的bean上加上一个注解

@LoadBalanced注解赋予RestTemplate负载均衡的能力

之后就是可以跑项目来测试了

步骤:

  1. 先要启动EurekaServer,7001/7002服务
  2. 再要启动服务提供者provider,8001/8002服务
  3. http://localhost/consumer/payment/get/1
  4. 负载均衡效果达到,8001/8002端口交替出现
  5. Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能了

actuator微服务信息完善

我们的注册中心会直接暴露出我们的地址,这是我们不愿意看到了

于是乎actuator可以将信息配置

修改服务提供者的配置

代码语言:javascript
复制
instance:
    instance-id: payment8001

这样就不会暴露地址,之后有需要的情况下,我们悬停现实地址

代码语言:javascript
复制
prefer-ip-address: true

完整修改的服务提供者yml

代码语言:javascript
复制
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
  instance:
    instance-id: payment8001
    prefer-ip-address: true

配置完成之后就可以达到不直接暴露地址也可以看到地址的效果了

服务发现Discovery

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

我们在服务提供者的接口中添加展示服务信息的接口

代码语言:javascript
复制
@Resource
private DiscoveryClient discoveryClient;
 
 
@GetMapping(value = "/payment/discovery")
public Object discovery(){
    List services = discoveryClient.getServices();
    for (String element : services) {
        log.info("***** element:"+element);
    }
    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;
}

之后再主启动类上添加注解@EnableDiscoveryClient

启动测试就可以看到服务的信息了

尾声

Eureka的两大组件和机制以及一些测试信息完善到此结束啦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • springcloud
    • Eureka服务注册与发现
      • 单项目Eurekademo
      • 服务的注册
      • Eureka的自我保护机制
      • Eureka集群原理
      • actuator微服务信息完善
      • 服务发现Discovery
      • 尾声
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档