Spring Cloud Ribbon:负载均衡的服务调用

embedded/2024/10/30 18:46:23/

Spring Cloud Ribbon:负载均衡的服务调用

Spring Cloud Ribbon 是Spring Cloud Netflix 子项目的核心组件之一,主要给服务间调用及API网关转发提供负载均衡的功能,本文将对其用法进行详细介绍

Ribbon简介

Ribbon 是 Netflix 公司开源的一个用于负载均衡的客户端组件,它是 Spring Cloud 生态系统中的一部分;Ribbon 的主要目标是提供一种简单且可定制的负载均衡解决方案,用于在微服务架构中实现服务之间的调用和负载均衡

RestTemplate

RestTemplate 是 Spring Framework 提供的一个用于进行 HTTP 请求的客户端工具类;简化了在 Java 应用程序中进行 HTTP 通信的过程,并提供了丰富的方法来处理请求和响应


RestTemplate 提供了各种方法来执行不同类型的 HTTP 请求,包括 GET、POST、PUT、DELETE 等;支持发送请求并接收响应的各种数据类型,如字符串、字节数组、JSON 对象等

GET请求方法

<T> T getForObject(String url, Class<T> responseType, Object... uriVariables);<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables);<T> T getForObject(URI url, Class<T> responseType);<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables);<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables);<T> ResponseEntity<T> getForEntity(URI var1, Class<T> responseType);

POST请求方法

<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables);<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables);<T> T postForObject(URI url, @Nullable Object request, Class<T> responseType);<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables);<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables);<T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType);

PUT请求方法

void put(String url, @Nullable Object request, Object... uriVariables);void put(String url, @Nullable Object request, Map<String, ?> uriVariables);void put(URI url, @Nullable Object request);

DELETE请求方法

void delete(String url, Object... uriVariables);void delete(String url, Map<String, ?> uriVariables);void delete(URI url);

创建user-service模块

创建user-service,用于给Ribbon提供服务调用

  • 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 添加application.yml配置
server:port: 8201
spring:application:name: user-service
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:8001/eureka/
  • 添加UserController用于提供调用接口
/*** Created by macro on 2019/8/29.*/
@RestController
@RequestMapping("/user")
public class UserController {private Logger LOGGER = LoggerFactory.getLogger(this.getClass());@Autowiredprivate UserService userService;@PostMapping("/create")public CommonResult create(@RequestBody User user) {userService.create(user);return new CommonResult("操作成功", 200);}@GetMapping("/{id}")public CommonResult<User> getUser(@PathVariable Long id) {User user = userService.getUser(id);LOGGER.info("根据id获取用户信息,用户名称为:{}",user.getUsername());return new CommonResult<>(user);}@GetMapping("/getUserByIds")public CommonResult<List<User>> getUserByIds(@RequestParam List<Long> ids) {List<User> userList= userService.getUserByIds(ids);LOGGER.info("根据ids获取用户信息,用户列表为:{}",userList);return new CommonResult<>(userList);}@GetMapping("/getByUsername")public CommonResult<User> getByUsername(@RequestParam String username) {User user = userService.getByUsername(username);return new CommonResult<>(user);}@PostMapping("/update")public CommonResult update(@RequestBody User user) {userService.update(user);return new CommonResult("操作成功", 200);}@PostMapping("/delete/{id}")public CommonResult delete(@PathVariable Long id) {userService.delete(id);return new CommonResult("操作成功", 200);}
}

ribbonservice_154">创建ribbon-service模块

创建ribbon-service模块调用user-service模块演示负载均衡的服务调用

  • 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 配置application.yml

配置端口、注册中心地址及user-service的调用路径

server:port: 8301
spring:application:name: ribbon-service
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:8001/eureka/
service-url:user-service: http://user-service

负载均衡

/*** Created by macro on 2019/8/29.*/
@Configuration
public class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
  • 添加UserRibbonController类

注入RestTemplate,使用其调用user-service中提供的相关接口

/*** Created by macro on 2019/8/29.*/
@RestController
@RequestMapping("/user")
public class UserRibbonController {@Autowiredprivate RestTemplate restTemplate;@Value("${service-url.user-service}")private String userServiceUrl;@GetMapping("/{id}")public CommonResult getUser(@PathVariable Long id) {return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);}@GetMapping("/getByUsername")public CommonResult getByUsername(@RequestParam String username) {return restTemplate.getForObject(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username);}@GetMapping("/getEntityByUsername")public CommonResult getEntityByUsername(@RequestParam String username) {ResponseEntity<CommonResult> entity = restTemplate.getForEntity(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username);if (entity.getStatusCode().is2xxSuccessful()) {return entity.getBody();} else {return new CommonResult("操作失败", 500);}}@PostMapping("/create")public CommonResult create(@RequestBody User user) {return restTemplate.postForObject(userServiceUrl + "/user/create", user, CommonResult.class);}@PostMapping("/update")public CommonResult update(@RequestBody User user) {return restTemplate.postForObject(userServiceUrl + "/user/update", user, CommonResult.class);}@PostMapping("/delete/{id}")public CommonResult delete(@PathVariable Long id) {return restTemplate.postForObject(userServiceUrl + "/user/delete/{1}", null, CommonResult.class, id);}
}

http://www.ppmy.cn/embedded/133674.html

相关文章

BGP4+ 基础及综合选路实验

一、BGP4 基础&#xff1a; 1、BGP4 的扩展版本 2、扩展能力自协商机制 3、支持传递多种地址簇地址&#xff08;IPv6、VPNv4、VPNv6等&#xff09; 4、新增属性用以支持多地址簇的传递 IPv6 必须用 AGUA 地址起 BGP 邻居&#xff1a;因为下一跳必须在路…

微服务网关之Gateway

1.微服务网关介绍 什么是网关 API Gateway&#xff0c;是系统的唯一对外的入口&#xff0c;介于客户端和服务器端之间的中间层&#xff0c;处理非业务功能&#xff0c;提供路由请求、鉴权、监控、缓存、限流等功能统一接入 智能路由AB测试、灰度测试负载均衡、容灾处理日志埋点…

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

在当今快速发展的建设行业中&#xff0c;工程项目管理软件作为项目管理的重要工具&#xff0c;正在发挥着越来越重要的作用。它通过集成多个功能模块&#xff0c;从建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;实现…

Spring 的事务传播机制

Spring 的事务传播机制定义了一个事务方法在遇到已经存在的事务时如何处理。事务传播属性&#xff08;Propagation&#xff09;提供了七种机制&#xff0c;以适应不同的业务需求和事务边界管理。 1. Spring 的事务传播机制的类型 &#xff08;1&#xff09;REQUIRED&#xff…

sqlyog软件

SQLyog&#xff1a;SQLyog的下载、安装-CSDN博客 navicat与SQLyog的区别_sqlyog和navicat-CSDN博客 MySQL是一个功能齐全的关系数据库管理系统&#xff0c;软件是开源的&#xff0c;MySQL数据库服务器速度快、可靠性高&#xff0c;扩展性强&#xff0c;且易于使用。 MySQL与…

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域&#xff0c;我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer&#xff08;MMDiT&#xff09;驱动的文本到图像模型&#xff0c;它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…

JavaSE笔记3】面向对象高级

目录 拓1&#xff1a;私有方法的优点 拓2&#xff1a;静态方法的优点 拓3&#xff1a;类的五大成分 拓4&#xff1a;硬编码和软编码 一、static 1. 概念 2. 成员变量在内存中执行原理 3. 类变量(静态变量)的使用场景 4. 两种成员变量 5. 两种成员方法 6. 类方法的使用场景 7.…