服务注册发现 springcloud netflix eureka

文章目录

  • 前言
    • 角色(三个)
  • 工程说明
    • 基础运行环境
    • 工程目录说明
    • 启动顺序(建议):
    • 运行效果
      • 注册与发现中心
      • 服务消费者:
  • 代码说明
    • 服务注册中心(Register Service)
    • 服务提供者(Provider Service)
    • 服务消费者(Consumer Service)
    • 服务提供者SDK(Provider Service sdk)
  • 负载均衡
  • 源码地址

前言

角色(三个)

  • 服务注册中心(Register Service): Eureka Server,提供注册和发现功能;
  • 服务提供者(Provider Service):Eureka Client,将自己提供的服务注册到服务注册中心,以供服务消费者发现和调用;
  • 服务消费者(Consumer Service):Eureka Client,从服务注册中心获取服务列表;

工程说明

基础运行环境

	JDK: jdk-20.0.2spring cloud: 2022.0.4spring boot: 3.1.5

工程目录说明

demo-springcloud-netflix-eureka (父工程)
├── demo-springcloud-netflix-eureka-consumer (服务消费者,端口:8000)
├── demo-springcloud-netflix-eureka-provider-impl1 (服务提供者,端口:9001)
├── demo-springcloud-netflix-eureka-provider-impl2(服务提供者,端口:9002)
├── demo-springcloud-netflix-eureka-provider-sdk(服务端,SDK)
├── demo-springcloud-netflix-eureka-register1(服务注册中心,端口:7001)
└── demo-springcloud-netflix-eureka-register2(服务注册中心,端口:7002)

注意: 示例中,为了方便看效果,服务注册中心服务提供者分别提供两个工程,内部代码都一样,只是端口不同。

启动顺序(建议):

demo-springcloud-netflix-eureka-register1
demo-springcloud-netflix-eureka-register2
demo-springcloud-netflix-eureka-provider-impl1
demo-springcloud-netflix-eureka-provider-impl2
demo-springcloud-netflix-eureka-consumer

运行效果

注册与发现中心

http://localhost:7001 或 http://localhost:7002

注册与发现中心

服务消费者:

访问这个地址,将随机返回结果:http://localhost:8000/main2?name=abc123

hello: abc123, I'm 9001
hello: abc123, I'm 9002

代码说明

服务注册中心(Register Service)

demo-springcloud-netflix-eureka-register1,端口:7001

关键依赖(pom.xml)

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

关键配置(application.properties)

spring.application.name=demo-springcloud-netflix-eureka-register
server.port=7001eureka.instance.hostname=${spring.application.name}
eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true# 是否将自己注册到Eureka-Register中,默认的为true,单机设置为false,集群设置为true
eureka.client.register-with-eureka=true# 是否从Eureka-Register中获取服务注册信息,默认为true
eureka.client.fetch-registry=false# 这里是配置
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/,http://localhost:7002/eureka/# 测试时关闭自我保护机制,保证不可用服务及时踢出
eureka.server.enable-self-preservation=false

启动类:

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

demo-springcloud-netflix-eureka-register2,端口:7002
demo-springcloud-netflix-eureka-register1代码完全一样,只是application.properties中的server.port=7002

spring.application.name=demo-springcloud-netflix-eureka-register
server.port=7002
....

服务提供者(Provider Service)

demo-springcloud-netflix-eureka-provider-impl1,端口:9001

关键依赖(pom.xml)

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

关键配置(application.properties)

spring.application.name=demo-springcloud-netflix-eureka-provider
server.port=9001eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true# 每间隔2s,向服务端发送一次心跳,证明自己依然”存活“
eureka.instance.lease-renewal-interval-in-seconds=2# 告诉服务端,如果我10s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
eureka.instance.lease-expiration-duration-in-seconds=10# 是否将自己注册到Eureka-Register中,默认的为true
eureka.client.register-with-eureka=true# 是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/,http://localhost:7002/eureka/

启动类:

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

demo-springcloud-netflix-eureka-provider2,端口:9002
demo-springcloud-netflix-eureka-provider1代码完全一样,只是application.properties中的server.port=9002

spring.application.name=demo-springcloud-netflix-eureka-provider
server.port=9002
....

服务消费者(Consumer Service)

demo-springcloud-netflix-eureka-consumer,端口:8000

关键依赖(pom.xml)

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

关键配置(application.properties)

spring.application.name=demo-springcloud-netflix-eureka-consumer
server.port=8000eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true
eureka.instance.app-group-name=demo-springcloud-eureka-client-a
eureka.instance.lease-renewal-interval-in-seconds=2# 是否将自己注册到Eureka-Server中,默认的为true,这里设置为false,表示不注册,不希望被别的服务发现
eureka.client.register-with-eureka=false
eureka.client.registry-fetch-interval-seconds=2# 是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/,http://localhost:7002/eureka/

启动类:

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

服务提供者SDK(Provider Service sdk)

实际工作中,该工程应该由服务提供者开发团队开发,供服务消费者依赖调用,来实现远程调用。本实例使用openfeign。

关键依赖(pom.xml)

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

关键代码(demo-springcloud-netflix-eureka-provider-sdk工程ProviderService类):

// 接口,无需手写实现类
@Component
@FeignClient(name = ProviderConstants.SERVICE_ID)
public interface ProviderService {// 服务提供者需提供“/sub”接口服务@RequestMapping(value = "/sub")String test(@RequestParam("name") String name);// 其他服务....
}

服务提供者依赖后使用(demo-springcloud-netflix-eureka-provider-impl1工程)

@Service
public class DemoService implements ProviderService {@Autowiredprivate Environment env;public String test(String name) {return "hello: " + name + ", I'm " + env.getProperty("server.port");}
}@Controller
public class DemoController {@Autowiredprivate DemoService service;@ResponseBody@RequestMapping("/sub")public String test(String name) {return service.test(name);}
}

服务消费者依赖后使用(demo-springcloud-netflix-eureka-consumer工程)


@Autowired
private ProviderService providerService;@ResponseBody
@RequestMapping("/main2")
public String main2(String name) {return providerService.test(name);
}

负载均衡

客户端负载:(demo-springcloud-netflix-eureka-consumer工程)

@Configuration(proxyBeanMethods = false)
public class CustomLoadBalancerConfig {@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {var name = ProviderConstants.SERVICE_ID;return new CustomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
// CustomLoadBalancer.javaprivate Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + serviceId);}return new EmptyResponse();}// 随机var index = ThreadLocalRandom.current().nextInt(instances.size());var instance = instances.get(index);return new DefaultResponse(instance);}

源码地址

https://gitee.com/xiaojianhx/demo-springcloud-netflix-eureka

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/199064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三十二、W5100S/W5500+RP2040树莓派Pico<UPnP示例>

文章目录 1 前言2 简介2 .1 什么是UPnP&#xff1f;2.2 UPnP的优点2.3 UPnP数据交互原理2.4 UPnP应用场景 3 WIZnet以太网芯片4 UPnP示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着智能家居、物联网等…

ESP32-BLE基础知识

一、存储模式 两种存储模式&#xff1a; 大端存储&#xff1a;低地址存高字节&#xff0c;如将0x1234存成[0x12,0x34]。小端存储&#xff1a;低地址存低字节&#xff0c;如将0x1234存成[0x34,0x12]。 一般来说&#xff0c;我们看到的一些字符串形式的数字都是大端存储形式&a…

服务器端请求伪造(SSRF)

概念 SSRF(Server-Side Request Forgery&#xff0c;服务器端请求伪造) 是一种由攻击者构造形成的由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要攻击目标网站的内部系统。&#xff08;因为内部系统无法从外网访问&#xff0c;所以要把目标网站当做中间人来…

Flutter 中在单个屏幕上实现多个列表

今天&#xff0c;我将提供一个实际的示例&#xff0c;演示如何在单个页面上实现多个列表&#xff0c;这些列表可以水平排列、网格格式、垂直排列&#xff0c;甚至是这些常用布局的组合。 下面是要做的&#xff1a; 实现 让我们从创建一个包含产品所有属性的产品模型开始。 …

Android描边外框stroke边线、rotate旋转、circle圆形图的简洁通用方案,基于Glide与ShapeableImageView,Kotlin

Android描边外框stroke边线、rotate旋转、circle圆形图的简洁通用方案&#xff0c;基于Glide与ShapeableImageView&#xff0c;Kotlin 利用ShapeableImageView专门处理圆形和外框边线的特性&#xff0c;通过Glide加载图片装载到ShapeableImageView。注意&#xff0c;因为要描边…

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…

每天学习一点点之 Spring Web MVC 之抽象 HandlerInterceptor 实现常用功能(限流、权限等)

背景 这里介绍一下本文的背景&#xff08;废话&#xff0c;可跳过&#xff09;。上周有个我们服务的调用方反馈某个接口调用失败率很高&#xff0c;排查了一下&#xff0c;发现是因为这个接口被我之前写的一个限流器给拦截了&#xff0c;随着我们的服务接入了 Sentinel&#x…

MTK Pump Express 快速充电原理分析

1 MTK PE 1.1 原理 在讲正文之前&#xff0c;我们先看一个例子。 对于一块电池&#xff0c;我们假设它的容量是6000mAh&#xff0c;并且标称电压是3.7V&#xff0c;换算成Wh(瓦时)为单位的值是22.3Wh(6000mAh*3.7V)&#xff1b;普通的充电器输出电压电流是5V2A(10W)&#xff0c…

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…

Docker与Kubernetes结合的难题与技术解决方案

文章目录 1. **版本兼容性**技术解决方案 2. **网络通信**技术解决方案 3. **存储卷的管理**技术解决方案 4. **安全性**技术解决方案 5. **监控和日志**技术解决方案 6. **扩展性与自动化**技术解决方案 7. **多集群管理**技术解决方案 结语 &#x1f388;个人主页&#xff1a…

编程刷题网站以及实用型网站推荐

1、牛客网在线编程 牛客网在线编程https://www.nowcoder.com/exam/oj?page1&tab%E8%AF%AD%E6%B3%95%E7%AF%87&topicId220 2、力扣 力扣https://leetcode.cn/problemset/all/ 3、练码 练码https://www.lintcode.com/ 4、PTA | 程序设计类实验辅助教学平台 PTA | 程…

【Java 进阶篇】Ajax 实现——原生JS方式

大家好&#xff0c;欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客&#xff01;在前端开发中&#xff0c;我们经常需要与服务器进行数据交互&#xff0c;而 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步请求的技术&#xff0c;它…

云原生专栏丨基于服务网格的企业级灰度发布技术

灰度发布&#xff08;又名金丝雀发布&#xff09;是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。在其上可以进行A/B testing&#xff0c;即让一部分用户继续用产品特性A&#xff0c;一部分用户开始用产品特性B&#xff0c;如果用户对B没有什么反对意见&#xff0c;…

广州华锐互动VRAR:VR教学楼地震模拟体验增强学生防震减灾意识

在当今社会&#xff0c;地震作为一种自然灾害&#xff0c;给人们的生活带来了巨大的威胁。特别是在学校这样的集体场所&#xff0c;一旦发生地震&#xff0c;后果将不堪设想。因此&#xff0c;加强校园安全教育&#xff0c;提高师生的防震减灾意识和能力&#xff0c;已经成为了…

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…

Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

Zotero以其丰富的插件而闻名&#xff0c;使用起来十分的带劲&#xff0c;最重要的是它是免费的、不卡顿&#xff0c;不像某专业软件。 然而Zotero在word插入参考文献时&#xff0c;无法为参考文献添加超链接&#xff0c;这是一个不得不提的遗憾。 不过&#xff0c;有大佬已经…

asp.net健身会所管理系统sqlserver

asp.net健身会所管理系统sqlserver说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; 首页 会员注册 教练预约 系统公告 健身课程 在线办卡 用户中心[修改个人信息 修…

设计模式-行为型模式-模板方法模式

一、什么是模板模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法骨架&#xff0c;允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。 主要组成部分&#xff1a; 1、模板方法&#xff08;Templ…

如何在面试中胜出?接口自动化面试题安排上

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

AIGC 技术在淘淘秀场景的探索与实践

本文介绍了AIGC相关领域的爆发式增长&#xff0c;并探讨了淘宝秀秀(AI买家秀)的设计思路和技术方案。文章涵盖了图像生成、仿真形象生成和换背景方案&#xff0c;以及模型流程串联等关键技术。 文章还介绍了淘淘秀的使用流程和遇到的问题及处理方法。最后&#xff0c;文章展望…