当前位置: 首页 > news >正文

Spring Cloud Netflix 之 Ribbon

前言

请添加图片描述

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z
请添加图片描述

ChatGPT体验地址

请添加图片描述

文章目录

  • 前言
  • 前言
  • 1、负载均衡
    • 1.1、服务端负载均衡
    • 1.2、客户端负载均衡
  • 2、Ribbon实现服务间调用
    • 2.1、pom.xml配置
    • 2.2、application.yml配置
    • 2.3、bean配置类
    • 2.4、编写调用Eureka的代码
      • 2.4.1、定义用户服务接口
      • 2.4.2、编写用户服务实现类
      • 2.4.3、编写用户服务控制层代码
      • 2.4.4、统一返回结果
      • 2.4.5、统一异常处理
    • 2.5、启动项目,访问接口
      • 2.5.1、启动项目
      • 2.5.2、访问接口

前言

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

1、负载均衡

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

1.1、服务端负载均衡

image.png

1.2、客户端负载均衡

image.png

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个项目先运行
image.png

2.5.2、访问接口

访问地址:http://localhost/user/userInfoList
image.png

http://www.lryc.cn/news/372787.html

相关文章:

  • C语言怎样记住那么多的颜⾊?
  • LabVIEW软件开发任务的工作量估算方法
  • 【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error
  • Prometheus的四种指标类型
  • FastDFS SpringBoot 客户端 Demo搭建,支持文件上传下载
  • 十大成长型思维:定位思维、商业思维、时间管理思维、学习成长思维、精力管理思维、逻辑表达思维、聚焦思维、金字塔原理、目标思维、反思思维
  • GraphQL(9):Spring Boot集成Graphql简单实例
  • vue3+ Element-Plus 点击勾选框往input中动态添加多个tag
  • 唯美仙侠手游【九幽仙域】win服务端+GM后台+详细教程
  • Qt creator day2练习
  • 哪里有海量的短视频素材,以及短视频制作教程?
  • 文章MSM_metagenomics(三):Alpha多样性分析
  • Web前端与其他前端:深度对比与差异性剖析
  • AI 客服定制:LangChain集成订单能力
  • 【计算机毕业设计】242基于微信小程序的外卖点餐系统
  • java程序监控linux服务器硬件,cpu、mem、disk等
  • 高考报志愿闲谈
  • 面试官考我Object类中的所有方法及场景使用?我...
  • Web前端精通教程:深入探索与实战指南
  • 四轴飞行器、无人机(STM32、NRF24L01)
  • OpenAI Assistants API:如何使用代码或无需代码创建您自己的AI助手
  • CentOS7 配置Nginx域名HTTPS
  • C++入门8 构造函数析构函数顺序|拷贝构造
  • 【git使用四】git分支理解与操作(详解)
  • 【docker】如何解决artalk的跨域访问问题
  • MYSQL 索引下推 45讲
  • CentOS7服务器中安装openCV4.8的教程
  • Java课程设计:基于swing的贪吃蛇小游戏
  • 【HarmonyOS】HUAWEI DevEco Studio 下载地址汇总
  • 华为OD刷题C卷 - 每日刷题30(小明找位置,分隔均衡字符串)