SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign
〇、SpringCloud
0.区别于单体项目和soa架构,微服务架构每个服务独立,灵活。
1. spring cloud是一个完整的微服务框架,springCloud包括三个体系:
spring cloud Netflix
spring cloud Alibaba
spring 其他
2.spring cloud 版本命名
早期以伦敦地铁名命名,后来采用年份命名。
3.spring cloud 涵盖有非常多的子框架,每个框架有属于自己的版本。学习阶段需要先了解每一个子框架的用法。每个spring cloud框架 对应的spring boot版本也不一样
这里采用H版本
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version></parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
一、Eureka
1.Eureka 分为 Eureka service服务器 和 Eureka client客户端
所有客户端都在 服务器中注册自己:
将自己的客户端主机名和ip端口号储存在服务器中,这个存储过程也可以使用redis完成。如果给客户端搭建集群,主机名一样。
当客户端需要远程调用其他客户端时,通过告知服务器客户端主机名获取多个ip及端口号
这时客户端拿到了一系列的ip及端口号。可以使用Ribbon计算出这次远程调用哪一个客户端。
2.搭建Eureka service服务器 配置文件
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
server:port: 8761 eureka:client:# 因为当前项目为服务,不需要向服务注册自己,默认为trueregister-with-eureka: false# 因为当前为非集群版eureka,所以不需要同步其他节点数据fetch-registry: false
3.搭建Eureka client服务器 配置文件
<dependencies><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></dependencies>
server:port: 9999 # 配置服务注册的名称 spring:application:name: application-client #配置EureKaServer的地址 默认为 http://localhost:8761/eureka/ #eureka: # client: # service-url: # defaultZone: http://localhost:8761/eureka/
4.访问Eureka
①开启service项目;
② 客户端编写三个启动类,每次启动时更改端口号;主机名application-client
③访问Eureka服务器
二、Ribbon
Ribbon是负责负载均衡的springCloud Netflix 子框架。
在访问Eureka 拿到访问地址后,本客户端调用Ribbon通过算法计算出一个访问地址。
核心接口为 LoadBalancerClient
1.这里启动两个 主机名为application-service 的客户端。
2.用一个application-client的客户端通过Eureka拿到application-service主机地址
3.多次访问localhost:9999/demo
可以看到默认的负载均衡策略为轮循。
三、远程调用 RestTemplate类
0)RestTemplate是spring用于发送http请求的模板类。这里配置该对象:
@LoadBalanced 注解用于开启Robbin负载均衡策略。
RandomRule对象是负载均衡的算法,随机选择调用地址。
1)创建springboot的父项目 、公共项目
新建子项目commen
commen依赖:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version> <!-- 请使用最新的版本号 --><scope>provided</scope>
</dependency>
2)服务器
服务器正常写增删改查的项目,这里测试就直接返回对应数据方便观察接口调用
@RestController
public class MyController {
// @Value("${server.port}")private int port = 8080;/*** 返回类型为集合,泛型为自定类型。*/@RequestMapping("/returnUsers")public List<User> returnUsers(int nums){List<User> result = new ArrayList<>();for(int i = 0; i < nums; i++){result.add(new User(100 + i, "姓名-" + i, 20+i));}return result;}/*** 任意请求方式, 返回值类型是集合。相对复杂的Java类型。* @return*/@RequestMapping("/returnList")public List<String> returnList(int nums){List<String> result = new ArrayList<>();for(int i = 0; i < nums; i++){result.add("返回结果 - " + i);}return result;}/*** 任意请求,传递路径地址参数* @param name* @param age* @return*/@RequestMapping("/restfulParams/{name}/{age}")public String restfulParams(@PathVariable("name") String name,@PathVariable int age){System.out.println("端口号: " + port + ", 任意请求方式,restful参数, name = " +name + " ; age = " + age);return "restful参数, name = " + name + " ; age = " + age;}/*** post请求,请求体传递参数。参数使用@RequestBody处理。*/@PostMapping("/postBodyParams")public String postBodyParams(@RequestBody Map<String, String> params){System.out.println("端口号: " + port + " , post请求,有请求体参数, params = " +params);return "post请求,请求体参数, params = " + params;}/*** post请求,有参数*/@PostMapping("/postWithParams")public String postWithParams(String name, int age){System.out.println("端口号: " + port + " , post请求,有参数, name = " +name + " ; age = " + age);return "post请求有参数 : name = " +name + " ; age = " + age;}/*** post请求,没有参数*/@PostMapping("/postNoParams")public String postNoParams(){System.out.println("端口号: " + port + " , post请求,没有参数");return "post请求,没有参数";}/*** get请求,包含参数*/@GetMapping("/getWithParams")public String getWithParams(String name, int age){System.out.println("端口号: " + port + " 。 get请求,有参数, name = "+ name + " ; age = " + age);return "get请求,包含参数 : name = " + name + " ; age = " + age;}/*** get请求,没有参数* @return*/@GetMapping("/getNoParams")public String getNoParams(){System.out.println("端口号:" + port + "。 get请求,无参数。");return "get请求,无参数。";}
}
服务器依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>commen</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
3)客户端配置RestTemplate对象
客户端依赖:
<dependencies><dependency><artifactId>spring-boot-starter-web</artifactId><groupId>org.springframework.boot</groupId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.example</groupId><artifactId>commen</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
4)使用RestTemplate对象在客户端测试服务器方法的调用
①请求行携带键值对的几种形式
②post请求自定义请求头 请求体为键值对
③post请求 传输请求体为json格式
④post请求 自定义传输请求体为json格式
⑤ exchange()通用公式
@SpringBootTest
public class RestTemplateTest {@Autowiredprivate RestTemplate restTemplate;@Testpublic void test(){String forObject = restTemplate.getForObject("http://localhost:8080/getNoParams", String.class);System.out.println("forObject = " + forObject);}@Testpublic void test1(){String forObject1 = restTemplate.getForObject("http://localhost:8080/getWithParams?name=张三&age=20", String.class);String forObject2 = restTemplate.getForObject("http://localhost:8080/getWithParams?name={a}&age={b}", String.class,"战法",29);Map<String,Object> map= new HashMap();map.put("x","阿森纳");map.put("y",20);String forObject3 = restTemplate.getForObject("http://localhost:8080/getWithParams?name={x}&age={y}", String.class,map);System.out.println("forObject1 = " + forObject1);System.out.println("forObject2 = " + forObject2);System.out.println("forObject3 = " + forObject3);}@Testpublic void testPost(){restTemplate.postForObject("http://localhost:8080/postNoParams",null,String.class);}@Testpublic void testPost1(){HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("content-type","application/x-www-form-urlencoded");MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();map.add("name","埃德加");map.add("age","20");HttpEntity<MultiValueMap<String,Object>> entity = new HttpEntity<>(map,httpHeaders);String s = restTemplate.postForObject("http://localhost:8080/postWithParams", entity, String.class);String s1 = restTemplate.postForObject("http://localhost:8080/postWithParams?name=咋很难&age=29", entity, String.class);System.out.println("s = " + s);System.out.println("s1 = " + s1);}@Testpublic void testPost2(){Map<String,Object> map = new HashMap<>();map.put("name","绽放");map.put("age",29);restTemplate.postForObject("http://localhost:8080/postBodyParams",map,String.class);}@Testpublic void testPost3() throws JsonProcessingException {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("content-type","application/json");// MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();Map<String,Object> map = new HashMap<>();map.put("name","埃德加");map.put("age","20");ObjectMapper objectMapper = new ObjectMapper();String s1 = objectMapper.writeValueAsString(map);HttpEntity<String> entity = new HttpEntity<>(s1,httpHeaders);String s = restTemplate.postForObject("http://localhost:8080/postBodyParams", entity, String.class);System.out.println("s = " + s);}@Testpublic void testEvery(){ResponseEntity<List<User>> exchange = restTemplate.exchange("http://localhost:8080/returnUsers?nums=9",HttpMethod.GET,null,new ParameterizedTypeReference<List<User>>() {});System.out.println("exchange = " + exchange);}
}
四、openfeign
1)编写Feign接口:
1.将要调用服务主机的Controller中所有单元方法全部复制
2.创建Feign接口,并粘贴所有方法,改写为抽象方法
@FeignClient("application-service")
public interface Feign {@RequestMapping("/returnUsers")public List<User> returnUsers(int nums);/*** 任意请求方式, 返回值类型是集合。相对复杂的Java类型。* @return*/@RequestMapping("/returnList")public List<String> returnList(@RequestParam("nums") int nums);/*** 任意请求,传递路径地址参数* @param name* @param age* @return*/@RequestMapping("/restfulParams/{name}/{age}")public String restfulParams(@PathVariable("name") String name,@PathVariable("age") int age);/*** post请求,请求体传递参数。参数使用@RequestBody处理。*/@PostMapping("/postBodyParams")public String postBodyParams(@RequestBody Map<String, String> params);/*** post请求,有参数*/@PostMapping("/postWithParams")public String postWithParams(@RequestParam("name") String name,@RequestParam("age") int age);/*** post请求,没有参数*/@PostMapping("/postNoParams")public String postNoParams();/*** get请求,包含参数*/@GetMapping("/getWithParams")public String getWithParams(@RequestParam("name")String name,@RequestParam("age")int age);/*** get请求,没有参数* @return*/@GetMapping("/getNoParams")public String getNoParams();
}
3.添加注解
2)开启Eureka service 及Eureka client主机application-service:
3)调用Feign接口:
相关文章:

SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign
〇、SpringCloud 0.区别于单体项目和soa架构,微服务架构每个服务独立,灵活。 1. spring cloud是一个完整的微服务框架,springCloud包括三个体系: spring cloud Netflix spring cloud Alibaba spring 其他 2.spring cloud 版本命名…...
微信小程序开发系列之-微信小程序性能优化
微信小程序开发系列之-微信小程序性能优化 性能优化是任何应用开发中的重要组成部分,尤其是在移动环境中。对于微信小程序而言,随着用户量的增加和应用功能的丰富,性能优化显得尤为关键。良好的性能不仅提升用户体验,还能增加用户…...

线程池面试集
目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…...

从密码学看盲拍合约:智能合约的隐私与安全新革命!
文章目录 前言一、什么是盲拍合约?二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展,智能合约在各种场景中的应用越来越广泛。盲…...
c++学习笔记(47)
七、_public.cpp #include "_public.h" // 如果信号量已存在,获取信号量;如果信号量不存在,则创建它并初始化为 value。 // 如果用于互斥锁,value 填 1,sem_flg 填 SEM_UNDO。 // 如果用于生产消费者模型&am…...

软件设计之SSM(1)
软件设计之SSM(1) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: Spring框架结构SpringIoC容器SpringIoC实践…...
STM32F745IE 能进定时器中断,无法进主循环
当你遇到STM32F745IE这类问题,即能够进入定时器中断但无法进入主循环(main() 函数中的循环),可能的原因和解决方法包括以下几个方面: 检查中断优先级和嵌套: 确保没有其他更高优先级的中断持续运行并阻止了主循环的执行。使用调试工具查看中断的进入和退出情况。检查中断…...

《凡人歌》中的IT职业启示录
《凡人歌》是由中央电视台、正午阳光、爱奇艺出品,简川訸执导,纪静蓉编剧,侯鸿亮任制片,殷桃、王骁领衔主演,章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 ,改编自纪静蓉的小说《我不是废柴》。该剧于2…...

go libreoffice word 转pdf
一、main.go 关键代码 完整代码 package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""os/exec""path/filepath" ) import _ "github.com/go-sql-driver/mysql"import &q…...
打造双模兼容npm包:无缝支持require与import
为了实现一个npm包同时支持require和import,你需要确保你的包同时提供了CommonJS和ES6模块的入口点。这通常是通过在package.json文件中指定main和module字段来实现的,以及在构建过程中生成两种不同模块格式的文件。 以下是具体步骤: 设置pa…...
便捷将屏幕投射到安卓/iOS设备-屏幕投射到安卓/iOS设备,Windows/Mac电脑或智能电视上-供大家学习研究参考
1. 下载并安装软件(安卓苹果都需要) 确保 Android 设备和 Windows/Mac电脑都安装。启动应用程序并将 Android 设备和 Windows / Mac 了解到同一个wifi下面。 2、 发起投屏请求 在接收设备上:...

yolox训练自己的数据集
环境搭建 gpu按自己情况安装 nvidia-smi 查看自己的版本 CUDA和cudnn 按自己的安装,我的驱动551.76,注意不要用最新的,官网只要求驱动是大于等于,可以用低版本的cuda,我安装的是CUDA 11.1 cuda下载后,…...

Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置
由于后边可能要启动多个服务,避免服务之间相互干扰,本课程建议每个服务独立部署到一台主机上,这样做会导致资源占用过多,可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署,而是采用命令行方式部署ÿ…...

基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论,也能对账户进行在线充值…...

支付宝远程收款api之小荷包跳转码
想要生成小荷包跳转码的二维码,需要进行以下步骤: 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息(可能会有变动) 3、可能需要一定的代码基础,讲所需信息填…...

STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能
STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能 文章目录 STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能前言部分主要相关代码# USMART介绍1. mf_scan_files 扫描磁盘文件2. mf_mount 挂载磁盘3. mf_open 打开文件4. mf_read 读数据内容5. mf…...

YOLOv8改进 | 融合篇,YOLOv8主干网络替换为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)
原始 YOLOv8 训练结果: YOLOv8 + MobileNetV3改进后训练结果: YOLOv8 + MobileNetV3 + CA 注意机制 + 添加小目标检测层改进后训练结果(极限涨点): 摘要 小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目…...

深入探索机器学习中的目标分类算法
在当今数据驱动的世界中,机器学习(Machine Learning, ML)正逐渐成为解决问题的重要工具。在众多机器学习任务中,目标分类(Classification)算法尤其受到关注。本文将深入探讨目标分类算法的基本概念、常见类…...

一文上手SpringSecurity【七】
之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…...

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来
【深圳龙链科技】是全球领先的Web3区块链技术开发公司,专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造,立足于香港这一国际金融中心,放眼全球,汇聚了华…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...