《微服务实战》 第五章 Spring Cloud Netflix 之 Ribbon

news/2024/10/18 16:51:11/

前言

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具,其主要功能是提供客户端的负载均衡算法和服务调用。

1、负载均衡

负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。
常见的负载均衡方式有两种:服务端负载均衡、客户端负载均衡

1.1、服务端负载均衡

在这里插入图片描述

1.2、客户端负载均衡

在这里插入图片描述

2、Ribbon实现服务间调用

Ribbon 可以与 RestTemplate(Rest 模板)配合使用,以实现微服务之间的调用
示例:
建立C端API工程customer-api

2.1、pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.hqyj</groupId><artifactId>SpringCloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>customer-api</artifactId><name>customer-api</name><description>customer-api</description><properties><java.version>1.8</java.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--devtools 开发工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!--Spring Boot 测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--junit 测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- 修改后立即生效,热部署 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><version>1.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.hqyj</groupId><artifactId>common-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>

2.2、application.yml配置

server:port: 80eureka:client:register-with-eureka: false #本微服务为服务消费者,不需要将自己注册到服务注册中心fetch-registry: true  #本微服务为服务消费者,需要到服务注册中心搜索服务service-url:defaultZone: http://localhost:7001/eureka

2.3、bean配置类

配置RestTemplate、开启负载均衡

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/**** @title bean配置类* @desctption 配置RestTemplate、开启负载均衡* @author kelvin* @create 2023/5/11 14:33**/
@Configuration
public class ConfigBean {@Bean //将 RestTemplate 注入到容器中@LoadBalanced //在客户端使用 RestTemplate 请求服务端时,开启负载均衡(Ribbon)public RestTemplate getRestTemplate() {return new RestTemplate();}
}

2.4、编写调用Eureka的代码

2.4.1、定义用户服务接口

import com.hqyj.common.model.UserInfo;
import java.util.List;/**** @title 用户服务 接口* @desctption 用户服务* @author kelvin* @create 2023/5/11 14:22**/
public interface UserConsumerService {/*** 获取用户信息列表* @return*/public List<UserInfo> userInfoList();}

2.4.2、编写用户服务实现类

import com.hqyj.common.model.UserInfo;
import com.hqyj.customerapi.service.UserConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.List;/**** @title 用户服务 实现类* @desctption 用户服务* @author kelvin* @create 2023/5/11 14:22**/
@Service
public class UserConsumerServiceImpl implements UserConsumerService {private String REST_URL_PROVIDER_PREFIX = "http://USER-SERVICE";@Autowiredprivate RestTemplate restTemplate;/*** 获取用户信息列表* @return*/@Overridepublic List<UserInfo> userInfoList() {return this.restTemplate.getForObject(this.REST_URL_PROVIDER_PREFIX + "/user/userInfoList",List.class);}
}

2.4.3、编写用户服务控制层代码

import com.hqyj.common.model.UserInfo;
import com.hqyj.customerapi.service.UserConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;/**** @title UserConsumerController* @desctption 用户控制层* @author kelvin* @create 2023/5/11 14:22**/
@RestController
@RequestMapping("/user")
public class UserConsumerController {@Autowiredprivate UserConsumerService userConsumerService;@GetMapping("/userInfoList")public List<UserInfo> userInfoList(){return userConsumerService.userInfoList();}
}

2.4.4、统一返回结果

在公共模块common-api里面添加DTO

import lombok.Data;/**** @title 统一返回格式类* @param <T>* @desctption 统一返回格式* @author kelvin* @create 2023/5/11 14:28**/
@Data
public class ResponseDTO<T> {/*** 返回编码*/private Integer code;/*** 统一返回消息*/private String message;/*** 统一返回数据体*/private T data;}

2.4.5、统一异常处理

实现 ResponseBodyAdvice接口

import com.hqyj.common.dto.ResponseDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/**** @title 统一异常处理类* @desctption 统一异常处理* @author ltf* @create 2023/5/11 14:33**/
@RestControllerAdvice(basePackages = "com.hqyj.customerapi.controller")
@Slf4j
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {//true为织入通知return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {ResponseDTO<Object> objectResponseDTO = new ResponseDTO<>();objectResponseDTO.setCode(200);objectResponseDTO.setData(body);return objectResponseDTO;}/*** 统一异常处理* @param e* @return*/@ExceptionHandler(value = Exception.class)public Object exception(Exception e){log.error("系统异常",e);ResponseDTO<Object> objectResponseDTO = new ResponseDTO<>();objectResponseDTO.setCode(500);objectResponseDTO.setMessage("系统异常");return objectResponseDTO;}
}

2.5、启动项目,访问接口

2.5.1、启动项目

需要上一章节的2个项目先运行
在这里插入图片描述

2.5.2、访问接口

访问地址:http://localhost/user/userInfoList
在这里插入图片描述


http://www.ppmy.cn/news/64557.html

相关文章

MES管理系统有什么功能?前期实施MES需要做些什么

MES系统是在制造业数字化的环境下&#xff0c;围绕生产制造执行而开发的一套生产管理系统。它以车间为管理核心&#xff0c;通过集成各信息系统&#xff0c;整合企业资源&#xff0c;实现从订单下达到产品完成的整个生产制造过程的数字化管理。 MES系统在实施前需要进行各种准备…

5.设计模式之模板方法

前言 模板方法模式是软件开发中经常用得到模式。在很多流行的框架中都能看到他的身影。比如spring&#xff0c;junit&#xff0c;servlet等等。它定义了一个操作中的算法骨架&#xff0c;将某些步骤延迟到子类中实现。 这样&#xff0c;新的子类可以在不改变一个算法结构的前…

操作系统基础知识介绍之可靠性与可用性(包含MTTF、MRBF、MTTR等)

计算机是在不同的抽象层上设计和构建的。 我们可以通过计算机递归地下降&#xff0c;看到组件将自身放大为完整的子系统&#xff0c;直到我们遇到单个晶体管。 尽管有些故障很普遍&#xff0c;例如断电&#xff0c;但许多故障仅限于模块中的单个组件。 因此&#xff0c;一个模块…

Java框架学习04(SpringBoot自动装配原理)

1、什么是 SpringBoot 自动装配&#xff1f; 2、SpringBoot 是如何实现自动装配的&#xff1f;如何实现按需加载&#xff1f; 3、如何实现一个 Starter&#xff1f; 前言 使用过 Spring 的小伙伴&#xff0c;一定有被 XML 配置统治的恐惧。即使 Spring 后面引入了基于注解的配…

【 断电延时继电器 电源监视 导轨安装 JOSEF约瑟 HJZS-E202 AC220V】

品牌&#xff1a;JOSEF约瑟型号&#xff1a;HJZS-E202名称&#xff1a;断电延时继电器额定电压&#xff1a;110、220VDC/AC&#xff1b;100VAC触点容量&#xff1a;250V/5A功率消耗&#xff1a;≤4.2W返回系数&#xff1a;10%额定电压 系列型号&#xff1a; HJZS-E202断电延时…

女子拍视频宣传家乡因高颜值走红 网友:是心动的感觉

近日&#xff0c;一位90后女子李巧因其高颜值在网上走红&#xff0c;引起了广泛的关注。 有网友认为她是新疆旅游协会秘书长&#xff0c;但她的助理郑先生称&#xff0c;李巧并非如此&#xff0c;而是一位民宿文旅行业达人。 据郑先生介绍&#xff0c;李巧曾走遍全中国&#xf…

手术麻醉系统源码——业务流程介绍

采用计算机和通信技术&#xff0c;实现监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能够如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高度共享&#xff0c;根据采集结果&#xff0c;综合其他患者数据&#xff0c;自动生成手…

Transformer结构细节

一、结构 Transformer 从大的看由 编码器输入、编码器、解码器、解码器输入和解码器输出构成。 编码器中包含了词嵌入信息编码、位置编码、多头注意力、Add&Norm层以及一个全连接层&#xff1b; 解码器中比编码器多了掩码的多头注意力层。 二、模块 2.1 Input Embeddi…