SpringCloud微服务 Eureka服务注册与发现
文章目录
- Eureka服务注册与发现
- 前置说明
- 引入Eureka项目架构
- 创建单机Eureka-Server注册中心
- 需求说明
- 思路分析
- 配置pom
- 配置文件
- 服务提供者注册
- 服务消费者注册
- 服务发现
- 自我保护
- 搭建EurekaServer集群
- 需求说明
- 创建EurekaServer9002微服务模块
- eureka集群数据同步
- 5台eureka服务集群
- 修改Hosts文件
- 将两个服务注册到服务器集群
- 搭建服务提供者provider集群
- 需求说明
- 创建member-service-provider-10002微服务模块
- 统一服务提供者别名
- 服务消费者负载均衡
- Discovery Client
- 需求分析
- 获取eureka server服务注册信息
Eureka服务注册与发现
前置说明
Spring Cloud生态中服务注册中心可选组件包括Eureka、Nacos、Zookeeper和Consul
学习必要性:
历史项⽬维护:早期分布式微服务项⽬多使⽤Eureka,⼯作中仍可能遇到需要维护的Eureka项⽬
技术演进参考:后期服务注册发现组件都参考了Eureka的设计理念
学习价值:掌握Eureka后更容易上⼿Nacos,且理解更深刻
六⼤核⼼问题:
o ⾼并发挑战:企业级项⽬需要处理⼤量并发请求
o 单点故障:单⼀provider实例可⽤性差
o 集群必要性:需要多个provider实例组成集群
o 服务发现:consumer如何动态发现可⽤服务实例
o 负载均衡:多个可⽤实例间的调⽤选择问题
o 解决⽅案:Eureka+负载均衡组件(Ribbon)可解决上述问题
硬编码弊端:
o 需要修改源码来应对provider地址变更
o ⽆法动态感知新加⼊的provider实例
o 难以实现负载均衡策略
Eureka作⽤:
o 服务注册中⼼:统⼀管理所有服务实例
o 服务发现机制:consumer可动态获取可⽤实例
o 配合Ribbon实现负载均衡
引入Eureka项目架构
集群部署需求:会员中⼼作为服务提供⽅需要部署集群实现⾼可⽤,但传统架构下服务消费者难以动态感知集群节点变化
硬编码问题:服务消费者需要硬编码服务提供者的地址信息,当服务提供者IP或端⼝变更时需要⼈⼯修改配置
负载均衡缺失:缺乏统⼀的负载均衡机制,难以实现请求在多个服务实例间的合理分配
核⼼组件:
o Eureka Server:注册中⼼集群,存储所有可⽤服务节点的注册信息(IP、端⼝等)
o Eureka Client:包含内置负载均衡器(轮询算法),⾃动处理与Server的交互
o 服务提供者:启动后⾃动注册到Eureka Server,默认每30秒发送⼼跳维持注册
服务注册流程:
o 注册阶段:服务提供者启动时向Eureka Server注册⾃⾝元数据
o 续约机制:通过定时⼼跳(renew)保持服务活性,超时未续约则⾃动注销(cancel)
o 服务同步:集群环境下Eureka Server节点间会⾃动同步注册表信息
服务发现流程:
o 注册同步:服务消费者启动时也会注册到Eureka Server
o 服务拉取:消费者定期从Server获取服务提供者的最新注册信息
o 远程调⽤:基于获取的服务列表,通过内置负载均衡器选择实例进⾏远程调⽤(remote call)
架构优势:
o 动态扩展:新服务实例加⼊时⾃动注册,⽆需⼈⼯⼲预配置
o 故障隔离:⼼跳机制可快速检测故障节点并剔除
o 负载均衡:客户端内置轮询算法实现请求分发
o 服务治理:通过控制台可直观查看所有服务节点状态
1.会员中⼼提供服务
集群实现⾼可⽤:会员中⼼作为服务提供⽅(provider)在项⽬中会做成集群,当某个微服务节点宕机时,其他节点仍可运⾏,保证整个分布式系统可⽤性。
服务消费⽅调⽤机制:服务消费⽅(consumer)通过remote call⽅式调⽤会员中⼼服务。
2. Eureka Server必要时做成集群
⾼可⽤必要性:Eureka Server也可以做成集群,防⽌单点故障导致⽆法获取服务注册信息。
⼼跳检测机制:默认30秒发送⼀次⼼跳,90秒未收到⼼跳会从注册表移除服务节点。
3. Eureka包含两个组件
Server组件:作为服务注册中⼼,维护服务注册表。
Client组件:
o 服务提供⽅需要集成Client完成服务注册
o 服务消费⽅需要集成Client实现服务发现
o 内置轮询(round-robin)负载均衡算法
4. Eureka Server提供注册服务
注册过程:微服务节点启动后通过配置在Eureka Server注册,注册表存储所有可⽤节点信息。
可视化界⾯:提供直观的Web界⾯展示已注册服务信息。
节点范围:包括服务提供⽅和消费⽅所有微服务节点。
5. EurekaClient简化Eureka Server交互
Java客户端:封装与Server的交互逻辑,简化开发。
⼼跳机制:
o 默认30秒周期发送⼼跳
o 3个周期(90秒)未收到⼼跳则移除服务
⾃动注销:防⽌失效节点继续被调⽤,保证调⽤成功率。
创建单机Eureka-Server注册中心
从单机版开发测试开始,逐步过渡到⽣产可⽤的集群部署⽅案
需求说明
基本架构:包含Eureka Server(注册中⼼)、Service Provider(服务提供者)和Service
Consumer(服务消费者)三个核⼼⻆⾊
实现⽬标:先搭建单机版Eureka Server,后续再扩展为集群实现⾼可⽤
开发策略:采⽤循序渐进⽅式,先完成单机版开发测试,再升级为集群模式
模块规划:
o 会员中⼼服务提供⽅(member-service-provider-10000)
o 服务消费⽅(member-service-consumer-80)
o 注册中⼼(e-commerce-eureka-server-9001)
思路分析
开发流程:
o 创建Module并完成基础配置
o 将服务提供⽅注册到Eureka Server
o 配置服务消费⽅从Eureka获取服务信息
o 进⾏完整功能测试
注意事项:
o 服务提供⽅需要明确注册到指定Eureka Server
o 服务消费⽅需要正确配置服务发现功能
o 测试阶段重点关注服务注册与发现机制是否正常⼯作
配置pom
模块命名规范:模块名称应体现功能(eureka-server)和端⼝号(9001),便于识别服务类型和访问端⼝ e-ecommerce-eureka-service-9001
端⼝配置要点:作为服务必须指定监听端⼝,Eureka Server默认使⽤9001端⼝
⼼跳机制:所有服务(包括消费⽅)都必须有⼼跳机制,⽤于定时获取服务变化和更新注册信息
创建⽅式:通过Maven创建Java模块,选择Project SDK 1.8
注意事项:
o 禁⽌直接覆盖已有pom.xml⽂件,会导致系统瘫痪
o 模块创建后需检查是否被⽗⼯程正确聚合管理
o 建议保持与教学⼀致的命名规范,避免后续混淆
版本仲裁:通过⽗⼯程的spring-cloud-dependencies管理版本(Hoxton.SR1)
依赖查找路径:实际版本定义在spring-cloud-netflix-dependencies的2.2.1.RELEASE
数据库相关依赖:Eureka Server不操作数据库,需移除spring-boot-starter-jdbc等⽆关依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.zzw</groupId><artifactId>e-commerce</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>e-ecommerce-eureka-service-9001</artifactId><dependencies><!--引入web-starter 老师说明我们使用版本仲裁(从父项目继承了版本)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--说明:starter-actuator 是springboot程序的监控系统, 可以实现系统的健康检测可以通过http://localhost:9001/actuator 看到相关的连接,和信息--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--说明:true表示依赖不传递给其他模块,如果其他模块需要使用lombok,需要重新引入lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--说明:spring-boot-starter-test 是Spring Boot的测试依赖,提供单元测试和集成测试的支持。包括JUnit、Mockito等常用测试框架。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--引入e-ecommerce-center-common-api--><dependency><groupId>com.zzw</groupId><artifactId>e-ecommerce-center-common-api</artifactId><version>${project.version}</version></dependency><!--引⼊spring-cloud-starter-netflix-eureka-server场景启动器版本仲裁:依赖版本从⽗项⽬继承,⽆需单独指定版本号--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
</project>
关键依赖:需要引⼊spring-cloud-starter-netflix-eureka-server场景启动器
版本仲裁:依赖版本从⽗项⽬继承,⽆需单独指定版本号
Web⽀持:同时需要引⼊web-starter依赖作为基础⽀持
配置文件
server:port: 9091
eureka:instance:hostname: localhost # 注册中心服务实例名lease-expiration-duration-in-seconds: 90 # 超时未续约则⾃动注销,过期(此时还未清理)lease-renewal-interval-in-seconds: 30 # 通过定时⼼跳(renew)保持服务活性client:register-with-eureka: false # 不向注册中心注册自己fetch-registry: false # 不从注册中心获取服务service-url: # 注册中心地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/server:# 开启自我保护模式 在Eureka服务器中,自我保护模式是一种保护机制,当Eureka服务器在短时间内丢失过多客户端(可能由于网络故障),# 则会进入自我保护模式。在该模式下,Eureka不会注销任何服务实例(即使它们已经过期),直到收到足够的心跳。# 这可以防止在发生网络分区故障时,服务实例被错误地注销。enable-self-preservation: true# 清理间隔(单位毫秒,默认是60*1000)。 这里设置为60秒,意味着每60秒会检查一次并清理过期的实例。eviction-interval-timer-in-ms: 60000
@SpringBootApplication //标识为Spring Boot应⽤
@EnableEurekaServer //关键注解,使应⽤作为Eureka Server运⾏, 缺少@EnableEurekaServer注解将导致应⽤⽆法作为注册中⼼运⾏
public class EurekaApplication {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(EurekaApplication.class, args);}
}
访问⽅式:通过http://localhost:9001访问管理界⾯
界⾯说明:
o DS Replicas:显示集群节点信息
o Instances:显示已注册服务实例(初始为空)
测试要点:
o 确认服务在9001端⼝正常监听
o 检查管理界⾯能否正常显示
o 验证⽆实例注册时的正确显示状态
服务提供者注册
将member-service-provider-10000
作为EurekaClient
注册到e-ecommerce-eureka-service-9001
成为服务提供者
。
1.引⼊Eureka项⽬架构剖析
架构组成: Eureka项⽬架构包括Eureka Server和多个服务提供者(Provider)与服务消费者(Consumer)。Eureka Server: 作为注册中⼼,负责服务的注册与发现,端⼝号为9001。
服务提供者: 如member-service-provider-10000,提供服务并注册到Eureka Server。
服务消费者: 调⽤服务提供者提供的服务。
2.引⼊EurekaClient依赖
依赖引⼊: 在member-service-provider-10000项⽬的pom.xml⽂件中引⼊spring-cloud-starter-netflix-eureka-client依赖。
注意事项:
o 确保引⼊的是starter⽽不是单独的eureka-client,以避免注册失败且不报错的问题。
o 使⽤版本仲裁,从⽗项⽬继承版本,避免版本不兼容导致的错误。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.修改application.yml⽂件
配置内容:
o register-with-eureka: 设置为true,表示将⾃⼰注册到Eureka Server。
o fetch-registry: 设置为true,表示从Eureka Server抓取注册信息。
o server URL: 配置Eureka Server的地址,如http://localhost:9001/eureka。
配置层级: 注意配置的层级关系,确保配置正确,否则可能导致注册失败且⽆任何提示。
集群配置: 如果服务提供者也是集群部署,fetch-registry必须配置为true,以配合ribbon使⽤负载均衡
eureka:client:register-with-eureka: true # 是否将自己注册到EurekaServer,默认为truefetch-registry: true # 是否从EurekaServer获取注册信息,默认为trueservice-url:defaultZone: http://localhost:9091/eureka/
4.添加注解
关键注解:在MemberProviderApplication.java
主启动类添加@EnableEurekaClient注解
作⽤:将普通Spring Boot应⽤标识为Eureka客户端,使其能够向Eureka Server注册并发送⼼跳
常⻅错误:容易误写为@EnableEurekaServer,需特别注意区分
底层机制:不加该注解会导致应⽤不会维护通讯机制,Eureka Server⽆法获取注册信息
5.测试顺序:
先启动Eureka Server(9001端⼝)
再启动Member Service Provider(10000端⼝)
成功标志:控制台⽆报错信息
⽹络配置:服务注册时会⾃动获取本机真实IP(如192.168.98.1),⽽⾮localhost
验证⽅法:访问http://localhost:9001查看服务列表
错误排查:若注册失败需检查配置⽂件和注解是否正确
6.微服务注册名配置说明
命名规则:由application.yml中的spring.application.name
决定
显示格式:在Eureka Dashboard中会转为⼤写形式
完整信息:包含服务名、IP地址和端⼝号(如192.168.98.1:10000)
注意事项:服务名中不要使⽤特殊字符,建议⽤连字符连接
注册内容:包含服务IP地址(如192.168.98.1)、端⼝号(如10000)和服务别名(如
member-service-provider-10000)
服务消费者注册
2.引⼊EurekaClient依赖
依赖引⼊: 在member-service-provider-10000项⽬的pom.xml⽂件中引⼊spring-cloud-starter-netflix-eureka-client依赖。
注意事项:
o 确保引⼊的是starter⽽不是单独的eureka-client,以避免注册失败且不报错的问题。
o 使⽤版本仲裁,从⽗项⽬继承版本,避免版本不兼容导致的错误。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.修改application.yml⽂件
配置内容:
o register-with-eureka: 设置为true,表示将⾃⼰注册到Eureka Server。
o fetch-registry: 设置为true,表示从Eureka Server抓取注册信息。
o server URL: 配置Eureka Server的地址,如http://localhost:9001/eureka。
配置层级: 注意配置的层级关系,确保配置正确,否则可能导致注册失败且⽆任何提示。
集群配置: 如果服务提供者也是集群部署,fetch-registry必须配置为true,以配合ribbon使⽤负载均衡
eureka:client:register-with-eureka: true # 是否将自己注册到EurekaServer,默认为truefetch-registry: true # 是否从EurekaServer获取注册信息,默认为trueservice-url:defaultZone: http://localhost:9091/eureka/
4.添加注解
关键注解:在MemberConsumerApplication.java
主启动类添加@EnableEurekaClient注解
作⽤:将普通Spring Boot应⽤标识为Eureka客户端,使其能够向Eureka Server注册并发送⼼跳
常⻅错误:容易误写为@EnableEurekaServer,需特别注意区分
底层机制:不加该注解会导致应⽤不会维护通讯机制,Eureka Server⽆法获取注册信息
服务发现
http://localhost:9091/
自我保护
搭建EurekaServer集群
需求说明
创建EurekaServer9002微服务模块
参考
1.创建e-ecommerce-eureka-service-9001微服务模块
2.配置pom
3.配置文件
文件复制: 将原9001的配置文件复制一份用于9002。
端口修改: 第一个要修改的是端口,从9001改为9002。
实例名调整: 服务实例名从localhost改为更具标识性的eureka9002.com。
相互注册: 配置不向注册中心注册自己(register-with-eureka: false),但表示自己就是注册中心(fetch-registry: false)。
注册地址: 设置与Eureka Server交互的地址,指向eureka9001.com。
4.创建主启动类EurekaApplication9002.java
eureka集群数据同步
1.解释defualtZone
表示服务注册中心的地址
server:port: 9001
eureka:instance:hostname: eureka9001.com # 注册中心服务实例名 (会去本地Hosts文件找到该域名对应的IP地址)client:register-with-eureka: false # 不向注册中心注册自己fetch-registry: false # 不从注册中心获取服务service-url: # 注册中心地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/defaultZone: http://eureka9002.com:9002/eureka/
2.eureka双节点同步
5台eureka服务集群
修改Hosts文件
路径说明: hosts⽂件位于Windows系统的C:\Windows\System32\drivers\etc⽬录下
访问⽅式: 需要通过⽂件管理器依次进⼊C盘→Windows→System32→drivers→etc⽂件夹
⽂件特征: 在etc⽬录下可以看到hosts⽂件,通常没有扩展名
编辑⽅法:
o 直接编辑: 如果能直接修改则保存即可
o 替代⽅案: 若⽆法直接编辑,需将⽂件复制到桌⾯修改后再覆盖回去
配置内容:
#eureka 主机名和ip映射
127.0.0.1 eureka9001.com
127.0.0.1 eureka9002.com
验证要点: 修改后必须确保内容正确,特别是主机名和IP的对应关系
启动顺序: 先启动eureka-server-9001和eureka-server-9002,顺序⽆关紧要
访问验证:
o 浏览器访问http://eureka9001.com:9001应显示指向eureka9002.com
o 浏览器访问http://eureka9002.com:9002应显示指向eureka9001.com
集群效果: 两个节点相互注册形成集群,这是配置成功的标志
常⻅问题: ⾸次配置容易出错,需要耐⼼调试直到出现相互指向的效果
将两个服务注册到服务器集群
集群架构:Eureka Server集群由多个节点组成(如9001和9002),节点间相互注册实现数据同步
服务注册机制:微服务需要同时注册到集群中的所有Eureka Server节点
故障容错:集群设计可避免单点故障,当某个节点宕机时其他节点仍可提供服务
defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/
优先发送到快递点A,如果快递点A挂了,再去快递点B. 两个快递点会互相同步信息(比如 A 收到新奶茶店的地址,会马上告诉 B)
搭建服务提供者provider集群
需求说明
Eureka Server集群: Eureka Server集群包括9001和9002两个端口,它们相互注册,实现服务发现和注册功能。
服务注册与发现: 服务提供者(如会员中心服务提供方)注册到Eureka Server集群,服务消费者(如会员中心服务消费方)从Eureka Server集群获取服务注册信息,实现远程调用。
高可用性: 为了避免单点故障,服务提供方也做成集群,即多个服务提供者注册到Eureka Server集群中,即使某个服务提供者出现故障,其他服务提供者仍然可以提供服务,保证系统的高可用性。
集群配置: 每个服务提供者(如member-service-provider-10000)都需要配置resources/application.yml文件,并修改主启动类名,以完成服务注册和集群配置。
测试: 完成集群配置后,需要进行测试,确保服务提供者可以成功注册到Eureka Server集群,并且服务消费者可以成功调用服务提供者的接口。
端口变化: 新增的微服务模块监听端口改为10002,与原有服务(如监听端口为10000的服务)提供相同功能,但端口不同。
新增10002端口,功能和原来的一样
创建member-service-provider-10002微服务模块
源码拷贝: 从member-service-provider-10000的src/main目录下拷贝JAVA和resources文件夹到新项目对应位置。
替换或删除: 可以选择替换新项目的原有文件或先删除再粘贴。
检查文件: 确认新项目中包含controller、dao、service等文件和资源文件如MAPR和application.yml。
依赖添加: 将member-service-provider-10000中的依赖信息添加到新项目的pom文件中,并刷新maven项目。
从原来的代码拷贝一份,形成服务集群。
修改端口号,修改应用名,修改主启动类名
统一服务提供者别名
统一别名后,服务消费者可以负载均衡调用。
修改配置文件,移除端口号后缀,统一使用member-service-provider作为服务名。
同一服务名可以有多个实例,重启idea, 防止run dashboard上服务名重复。
服务消费者负载均衡
本来是服务消费者直接调用的服务提供者,但为了防止硬编码,能够实时获取最新服务地址,通过eureka注册中心,调用相应服务。eureka注册中心存储了当前在线的所有的服务实例,服务消费方向eureka server发送请求,请求调用会员中心服务,eureka server会返回该服务下所有实例,由服务消费者负责负载均衡调用。
原先是服务消费方和服务提供方通过RestTemplate直接远程调用。
服务消费者拿着服务名+方法映射路径去请求数据
ribbon拦截到,拿着服务名去eureka client获取该服务名下的所有服务实例。
拿到服务实例后,ribbon负载均衡获取一个服务实例的ip,端口,拼接上方法映射路径,进行真正的请求
@Slf4j
@Controller
@RequestMapping("/member/consumer")
public class MemberConsumerController {//服务提供方url//public static final String MEMBER_SERVICE_PROVIDER_URL = "http://localhost:10000";/*1.member-service-provider 是服务提供方【集群】 注册到eureka server的名字2.也就是服务提供者【集群】对外暴露的名称为member-service-provider3.member-service-provider服务目前有两个Availability Zones, 两个实例别名分别是member-service-provider:10000, 还有一个是 member-service-provider:100024.还要增加一个注解@LoadBanlanced, 赋予RestTemplate负载均衡的能力, 也就是会根据你的负载均衡来选择某个服务去访问,默认是轮询算法, 当然我们也可以自己配置负载均衡算法*/public static final String MEMBER_SERVICE_PROVIDER_URL = "http://member-service-provider";@Resourceprivate RestTemplate restTemplate;@GetMapping("/selectById")@ResponseBodypublic Result selectById(Integer id) {Result result = restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL+ "/member/provider/selectById?id=" + id, Result.class); return result;}@PostMapping("/insert")@ResponseBodypublic Result insert(@RequestBody Member member) {Result result = restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL+ "/member/provider/insert", member, Result.class);return result;}
}
技术⽀撑:底层由Ribbon提供⽀持,与Eureka整合后⾃动获取服务注册信息
调⽤简化:消费端只需关注服务名称,⽆需维护具体地址和端⼝号
@Configuration
public class RestConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
Discovery Client
需求分析
典型服务信息:
o member-service-consumer:
实例1:192.168.56.1:80
o member-service-provider:
实例1:192.168.56.1:10002
实例2:192.168.56.1:10000
实现要点:
o 服务注册信息以列表形式存在
o 同⼀服务可能对应多个实例地址
o 获取的信息包含完整的服务调⽤URI
获取eureka server服务注册信息
1)装配RestTemplate对象
配置⽅式: 在服务消费⽅通过@Resource注解装配RestTemplate对象
服务地址: 使⽤常量"MEMBER-SERVICE-PROVIDER"作为服务名,格式为"http://服务名"
2)装配DiscoveryClient
关键注解: 使⽤@Resource注解进⾏装配
包选择: 必须选择org.springframework.cloud.client.discovery.DiscoveryClient接⼝,不能误⽤com.netflix.discovery.DiscoveryClient类
功能说明: ⽤于获取Eureka Server中注册的服务实例信息
3)接⼝⽅法的实现
获取服务列表: 通过discoveryClient.getServices()获取所有服务名称
遍历服务实例: 对每个服务使⽤discoveryClient.getInstances(service)获取实例列表
实例信息输出: 输出每个实例的serviceId、host、port和uri信息
⽇志记录: 使⽤log.info记录服务名和实例详细信息
@Slf4j
@Controller
@RequestMapping("/member/consumer")
public class MemberConsumerController {public static final String MEMBER_SERVICE_PROVIDER_URL = "http://member-service-provider";@Resourceprivate RestTemplate restTemplate;@Resourceprivate DiscoveryClient discoveryClient;@GetMapping("member/consumer/discovery")@ResponseBodypublic Object discovery() {List<String> services = discoveryClient.getServices();//遍历所有服务for (String service : services) {log.info("服务名: {}", service);List<ServiceInstance> instances = discoveryClient.getInstances(service);for (ServiceInstance instance : instances) {log.info("ID: {}, host: {}, port: {}, url: {}",instance.getServiceId(), instance.getHost(), instance.getPort(), instance.getUri());}}return discoveryClient;}
}
4)启动类配置
必要注解: 在主启动类上添加@EnableDiscoveryClient启⽤服务发现功能
组合注解: 需要与@EnableEurekaClient⼀起使⽤
注意事项: 不添加该注解会导致DiscoveryClient⽆法正常⼯作
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class MemberConsumerApplication80 {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(MemberConsumerApplication80.class, args);}
}
5)结果