springcloud之服务提供与负载均衡调用 Eureka

devtools/2024/10/21 1:39:13/

前言
提供一个基于Eurka的服务注册中心,两个服务提供者之后分别使用Ribbon、Fegin方式进行调用,测试负载均衡
在这里插入图片描述
服务提供者Service Provider 本质上是一个 Eureka Client,它在服务启动时,会调用服务注册方法,向 Eureka Server注册接口服务信息,包括地址、端口、服务名、入参、返回值等。当Eureka Server收到注册信息后,会维护在自己的注册列表,如下;

private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

服务消费者Service Consumer 本质也是一个 Eureka Client,它在服务启动时,也会向 Eureka Server 注册服务信息。同时在启动后会从Eureka Server 上获取所有实例的注册信息,包括 IP 地址、端口等,并缓存到本地。这个获取有一定的延时,因此我们在实际开发过程中如果服务方尚未启动完成,调用方不要着急启动避免造成调用失败。
EurekaClientController.java | 注意@EnableEurekaClient用于向注册中心提供服务

@EnableEurekaClient
@RestController
public class EurekaClientController {@Value("${server.port}")private int port;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return "Hi 明哥 | " + userId + " >: from eureka client port: " + port;}}

EurekaClientApplication.java | 服务启动类

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

application.yml | 配置文件链接服务注册中心,8001\8002分别配置启动

server:port: 8001 / 8002spring:application:name: demo-springcloud-eureka-clienteureka:client:serviceUrl:defaultZone: http://localhost:7397/eureka/

单个服务注册中心
服务注册中心用于承载接口提供方向上注册,同时正在调用方链接后可以获取指定应用的服务实例。
EurekaServerApplication.java | 通过注解@EnableEurekaServer启动服务注册与发现中心

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

application.yml | 服务注册中心配置文件,端口7397和我们之前写netty的服务的端口一致

server:port: 7397eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/spring:application:name: demo-springcloud-eureka-server

Feign服务调用方
Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而让我们不再需要显式地使用这两个组件。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,我们就可以定义好 HTTP 请求的参数、格式、地址等信息。接下来,Feign 会完全代理 HTTP 的请求,我们只需要像调用方法一样调用它就可以完成服务请求。

service/FeignService.java | 注解方式调用,方便易用。@FeignClient会在调用时进行解析服务到具体的http://ip:port/

@FeignClient(value = "demo-springcloud-eureka-client")
public interface FeignService {@RequestMapping(value = "/api/queryUserInfo", method = RequestMethod.GET)String queryUserInfo(@RequestParam String userId);}

web/FeignController.java | 使用接口提供服务 From Feign

@RestController
public class FeignController {@Resourceprivate FeignService ribbonService;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return ribbonService.queryUserInfo(userId) + " From Feign";}}

FeignApplication.java | 注解@EnableEurekaClient、@EnableFeignClients、@EnableDiscoveryClient获取调用注册中心服务

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

application.yml | eureka服务配置,从注册中心获取可用服务

server:port: 9001spring:application:name: demo-springcloud-feigneureka:client:serviceUrl:defaultZone: http://localhost:7397/eureka/

Ribbon服务调用方
Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡器。它可以通过在客户端中配置 ribbonServerList 来设置服务端列表去轮询访问以达到均衡负载的作用。

当 Ribbon 与 Eureka 联合使用时,ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心中获取服务实例列表。同时它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否已经启动。
service/RibbonService.java | 接口式硬编码调用不太易于维护,因此也是比较少用的方式

@Service
public class RibbonService {@Autowiredprivate RestTemplate restTemplate;public String queryUserInfo(String userId) {return restTemplate.getForObject("http://DEMO-SPRINGCLOUD-EUREKA-CLIENT/api/queryUserInfo?userId=" + userId, String.class);}}

web/RibbonController.java | 使用接口提供服务 From Ribbon

@RestController
public class RibbonController {@Resourceprivate RibbonService ribbonService;@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)public String queryUserInfo(@RequestParam String userId) {return ribbonService.queryUserInfo(userId) + " From Ribbon";}}

RibbonApplication.java | 通过注解@LoadBalanced注册rest模版,用于Ribbon接口调用

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class RibbonApplication {public static void main(String[] args) {SpringApplication.run(RibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}}

application.yml | eureka服务配置,从注册中心获取可用服务

server:port: 9002spring:application:name: demo-springcloud-ribboneureka:client:serviceUrl:defaultZone: http://localhost:7397/eureka/

测试验证
1:启动服务注册中心demo-springcloud-eureka-server
2:分别启动demo-springcloud-eureka-client,修改端口8001、8002启动两次提供两个服务
3:启动demo-springcloud-feign
4:启动demo-springcloud-ribbon
5:访问服务注册中心http://localhost:7397/

访问服务提供方;http://localhost:8001/api/queryUserInfo?userId=111 | 说明服务正常

访问Feign服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9001/api/queryUserInfo?userId=111

访问Ribbon服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9002/api/queryUserInfo?userId=111

总结
1:在使用SpringCloud时我们可以很轻松的使用到注册中心与很简单的方式去做服务调用
2:以上负载均衡,都是以轮询访问的方式实现的,实际开发过程中还会有一些依赖于机器性能、GC、调用量、响应时间等计算的权重值来做负载IRule
3:服务注册中心,负责维护注册的服务列表,同其他服务注册中心一样,支持高可用配置
4:服务提供方,作为一个 Eureka Client,向 Eureka Server 做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器 ip、端口号、域名等
5:服务消费方,作为一个 Eureka Client,向 Eureka Server 获取 Service Provider 的注册信息,并通过远程调用与 Service Provider 进行通信。

好了到这里就结束了springcloud之服务提供与负载均衡调用 Eureka的学习,大家一定要跟着动手操作起来。需要源码的 可si我获取;


http://www.ppmy.cn/devtools/127437.html

相关文章

天通卫星电话|移动手持终端|5G军工手持终端|全星魅

在当今这个信息瞬息万变的时代&#xff0c;通信技术作为连接世界的桥梁&#xff0c;其重要性不言而喻。随着科技的飞速发展&#xff0c;传统的通信手段已难以满足人们在极端环境或偏远地区的通信需求。于是&#xff0c;一款集高科技与实用性于一身的双模卫星电话应运而生&#…

视频网站后端架构:Spring Boot的创新应用

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…

大厂面试提问:Flash Attention 是怎么做到又快又省显存的?

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

flutter 使用三方/自家字体

将字体放入assets/fonts下 在pubspec.yaml文件中flutter下添加如下代码&#xff1a; flutter:fonts:- family: MyCustomFontfonts:- asset: assets/fonts/MyCustomFont.ttf 在flutter Text widget中使用字体 import package:flutter/material.dart;void main() > runApp(…

OpenCV的常用与形状形状描述相关函数及用法示例

OpenCV提供了提供了多种用于形状描述和分析的函数。这些函数能够帮助你提取图像中的形状特征&#xff0c;进行形状匹配、识别和分析。下面介绍一些常用的形状描述函数&#xff1a; 轮廓检测函数findContours() findContours()函数用于在二值图像中查找轮廓。有两个原型函数&…

香橙派刷机和开发环境准备(ubuntu20.04版)_随记1

前言&#xff1a; 目录&#xff1a; 3.38.1.3. PC 端安装 Paddle2ONNX 1、常用&#xff1a; 目录 一、香橙派刷ubuntu系统 2.3.2. 使用 RKDevTool 烧录 Linux 镜像到 TF 卡中的方法 a. 首先通过 USB 公对公数据线连接好开发板与 Windows 电脑&#xff0c;开发板 USB b. …

SpringBoot智能推荐:健康生活新趋势

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于智能推荐的卫生健康系统的开发全过程。通过分析基于智能推荐的卫生健康系统管理的不足&#xff0c;创建了一个计算机管理基于智能推荐的卫生健康系统的方案。…

数据结构-B树和B+树

一、B树 一个节点包含多个key-value值 假设一棵B树由M个参数构建&#xff0c;我们将其称为M阶B树 每个节点最多有M-1个key-value值&#xff0c;并且key值升序排列&#xff0c;每个节点最多能有M个叉 1.1 分类 二节点 三节点 四节点 五节点 key: 给每一个文件进行标号&…