Spring Cloud微服务入门(三)

服务注册与发现的概念

服务之间相互访问: 例如:用户中心与内容中心之间相互调用。
问题:

        服务调用需要知道对方的服务地址,地址写在哪里?

        如果服务是多个实例部署,该调用哪一个?

        如果服务是多个实例部署,每个实例负载如何分配?

解决不用修改代码始终能找到服务的方法: 独立的配置文件,让所有的服务读取这个配置。
依然存在的问题:

        随着服务越来越多,每个服务部署的实例越来越多,哪个上线,哪个下线不能靠手工维护。

        外部配置文件的问题,无法感知服务是不是存活,当只有调用时,才会发现服务存活与否。

服务注册中心。

原理:可以把服务注册与发现类比成一张表。 

服务注册与发现的产品

注册中心:

        使用Java开发的有:Nacos、Eureka、Zookeeper。

        使用Go语言开发的:Consul、CoreDNS。

选择注册与发现的产品:

首先我们学习的Java,更好的兼容,优先选择Java开发的。

         其次,Nacos作为后起之秀,当然要借助前辈的优势,所以Nacos能支持的,都支持了。

         在Spring Cloud体系上,Alibaba的产品,被称之为第二代微服务的典范,是应用的趋势,所以我们采用Nacos。 

服务注册中心:

        解决了服务始终能被找到,并且能及时发现服务是否存活的问题。

        一般集群都会部署很多个微服务节点。这些节点一般都具备两种角色,称为:“服务的提供者” 和 “服务的消费者”。

        “服务提供者”将自己的服务地址等信息登记到“服务注册中心”中,调用者(“服务消费者”)需要的时候,每次都先去“服务注册中心”查询即可。既解决了人工维护微服务节点状态的问题,也能解决多节点间负载均衡的问题。

服务注册与发现-Nacos

下载Nacos:

Redirecting to: https://nacos.io/

        登陆Nacos。 https://localhost:8848/nacos

        重要的功能: 服务管理。 配置管理。

使用Nacos

        新建Spring Boot的web项目。

        导入Spring Cloud Alibaba依赖。

                各版本之间的对应。

导入Spring Cloud Alibaba依赖。

         在dependencyManagement中加入依赖。 

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

在dependencies中加入Nacos依赖。

编写配置文件 在application.yml中,进行如下配置:
server:servlet:context-path:/userport:8080
spring:application:name:  user-centercloud:nacos:discovery:server-addr:  127.0.0.1:8848

启动项目,注册服务,在Nacos控制台中,存在配置的应用名称,说明服务注册成功。

引入nacos后的架构

 

 服务调用

常见的服务间调用方式有二种:

        RPC(Remote Produce Call)远程过程调用。 自定义数据格式,基于原生TCP通信,速度快、效率高,但较为复杂。 比如WebService框架CXF,阿里的Dubbo。

        HTTP,基于HTTP协议的服务调用。 跨平台、跨语言,但HTTP协议的信息较为臃肿,速度较慢。 比如HttpClient等。

基于HTTP的服务调用

JDK提供的HttpUrlConnection。

Apache的HttpClient。

Spring封装的RestTemplate。

Feign: NetFlix提供的,在RestTemplate和Ribbon基础上封装。

OpenFeign: Spring提供的,声明式服务调用。

RestTemplate介绍

RestTemplate:

        他简化了与HTTP服务的通信方式,统一了RESTful的标准,封装了http链接。

        相较于HttpClient等框架,他是一种更优雅的调用方式。

         常用方法: getForEntity()、getForObject()。 postForEntity()、postForObject()、postForLocation()。 PUT()、DELETE()等等。

RestTemplate问题

RestTemplate,调用的问题:

        地址是写死的,如果地址发生变化怎么办?。

        如果部署了多个实例(为了负载均衡)怎么办?

借助DiscoveryClient可以通过服务ID来访问,也可以按特定算法来访问服务的某个实例。

通过服务名让服务始终能找到:
//从注册中心一直只可以找到user-center
list<ServiceInstance>instances =discoveryclient.getInstances(serviceld:"user-center");
//使用是jdk1.8的特性
String targetuRL =instances.stream().map(instance ->instance.geturi().tostring()+"/"+
instance.getServiceId()+"/users/{id}")
.findFirst()//如果有多个实例,只取第一个实例
.orElseThrow(()->new IllegalArgumentException("当前没有实例"));
log.info(targetURL);
//通过id查询share
Share share =shareMapper.selectByPrimaryKey(id);
//通过share的userid查询userDTO
Integer userId =share.getUserId();
UserDTO userDTO =restTemplate.getForObject(
targetURL,
UserDTO.class,
userId);
使用随机算法,随机访问一个实例:
//从注册中心一直只可以找到user-center
List<ServiceInstance>instances =discoveryclient.getInstances(serviceld:"user-center");
//使用是jdk1.8的特性
List<String>targetuRLS =instances.stream()
.map(instance ->instance.getUri().tostring()+"/"+
instance.getServiceId()+"/users/{id}").collect(Collectors.tolist());//随机一个实例出来
int i =ThreadLocalRandom.current().nextInt(targetURLS.size());String targetuRL =targetURLS.get(i);
log.info(targetURL);
负载均衡简析

负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。 以上例子中DiscoveryClient实现了简单的负载均衡

但仍然存在问题:

        访问服务的代码,实现了负载,但很繁琐。

        在业务逻辑中,出现了选择服务实例的代码,耦合高。

Ribbon简介

Ribbon是Netflix开源的客户端侧的负载均衡器。他简化服务调用的开发,并为我们提供一系列的负载均衡的算法。

 
 Ribbon的使用

添加Nacos依赖,因为Nacos依赖了Ribbon,所以不需要额外引入,默认情况下,也不需要加配置。 给RestTemplate开启Ribbon:

@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}

修改服务调用代码: 

//通过id查询share
Share share =shareMapper.selectByPrimaryKey(id);//通过share的userid查询userDTO
Integer userId =share.getUserId();
//url直接使用服务名,ribbon会给我们自动选择一个实例执行
UserDTo userDTO =restTemplate.getForObject(
url:"http://user-center/user-center/users/{id}",
JserDTO.class,
userId);
Ribbon的负载均衡规则 
 Ribbon的负载均衡配置

#细粒度配置,针对某一个服务

user-center:

        ribbon:

                NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

为所有微服务配置负载均衡: 在ComponentScan外新建全局Ribbon配置类:

@Configurationpublic class DefaultRibbonconfiguration {@Beanpublic IRule ribbonRule(){return new RandomRule();}

所有微服务配置负载均衡: 在项目中新增Ribbon配置类 

@Configuration
@RibbonClients(defaultConfiguration =DefaultRibbonConfiguration.class)public class RibbonConfiguration {
}
Ribbon的配置项
 
Ribbon配置属性的方式

<clientName>.ribbon.xxx 如下属性:

        NFLoadBalancerClassName: ILoadBalancer实现类。

        NFLoadBalancerRuleClassName: Irule实现类。

        NFLoadBalancerPingClassName: Iping实现类。

        NIWSServerListClassName: ServerList实现类。

        NIWSServerListFilterClassName: ServerListFilter实现类 

Ribbon懒加载配置

服务重启后,第一次访问会比较慢,原因是Ribbon默认为所有的微服务开启的是懒加载模式,当服务调用到的时候,才会去创建对应的请求连接,如http://user-center/users/1,解决这个问题,需要在application.yml中配置如下: 

ribbon:eager-load;#开启饥饿加载enabled:  true#细粒度配置,指定服务,如果是多个,使用逗号分隔clients:  user-center
Ribbon扩展

在Ribbon的规则中,不支持Nacos的权重,而Nacos权重在实例的应用中,作用很大,可根据机器的配置动态调整所承受的请求量,所以需要扩展Ribbon的负载均衡策略。 

 

编写代码扩展Ribbon支持Nacos权重,继承AbstractLoadBalancerRule,编写代码,开启配置。
@override
public Server choose(Object o){
try {
BaseLoadBalancer loadBalancer =(BaseLoadBalancer)this.getLoadBalancer();
//想要请求的微服务名称
String name =loadBalancer.getName();
NamingService namingService =nacosDiscoveryProperties.namingServiceInstance();
Instance instance =namingService.selectoneHealthyInstance(name);
log.info("选择的实例是:port={},instance ={}",instance.getPort(),instance);
return new NacosServer(instance);
}catch(NacosException e){
e.printstackTrace();
return null;
Feign 

什么是Feign: Feign是Netflix开源的声明式HTTP客户端,致力于让编写http请求更简单。

RestTemplate与Feign的区别:

OpenFeign
什么是OpenFeign: OpenFeign是一个显示声明式的WebService客户端。 Spring Cloud对Feign进行了封装,使其支持MVC注解和HttpMessageConverts等,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。 
使用OpenFeign

在启动类上加注解: 

 

编写服务调用接口:

在Service中注入并调用相关的方法

OpenFeign的组成 

 

OpenFeign的配置

全局配置日志,所有的Feign接口生效:

 属性配置方式支持的配置项

OpenFeign的性能优化

性能优化的方法:

        把默认的请求方式修改为httpclient或okhttp。

        在配置文件中,配置连接池(性能提升15%左右)。

        配置feign的日志级别,建议设置成BASIC。

引依赖:

写配置:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack Compose -> 状态机制的背后秘密

前言 上一章我们讲解了 Jetpack Compose 的无状态、状态提升、单向数据流 本章我们讲解下状态机制的背后秘密 List 前面我们讲过&#xff0c;通过 by mustableStateOf() 就可以被 Compose 自动订阅了&#xff1b;我们前面是通过 String 类型进行的自动订阅&#xff0c;那么换成…

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式&#xff1a; 论文&#xff1a;https://arxiv.org/abs/2401.17270 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…

Linux命令-dos2unix命令(将DOS格式文本文件转换成Unix格式)

说明 dos2unix命令 用来将DOS格式的文本文件转换成UNIX格式的&#xff08;DOS/MAC to UNIX text file format converter&#xff09;。DOS下的文本文件是以 \r\n 作为断行标志的&#xff0c;表示成十六进制就是0D0A。而Unix下的文本文件是以\n作为断行标志的&#xff0c;表示成…

vitepress系列-01-搭建笔记骨架

文章目录 搭建笔记骨架 搭建笔记骨架 环境依赖&#xff1a;Node.js 18 及以上版本。 项目创建-以macOS为例 # 1.创建空项目 mkdir vitepress-learn-notes# 2.进入 vitepress-learn-notes cd vitepress-learn-notes# 3. 初始化项目 pnpm init# 4.安装vitepress 根据自己电脑的安…

MongoDB数据更新中的乘法$mul

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第57篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 空闲下来&#xff0c;仔细阅读Mongodb的官方文档&#xff0c;发现很多新的功能。mongodb为了给开发…

【C++】STL--list

目录 list的介绍 list的使用 list的构造 list iterator的使用 list capacity list modifiers list的迭代器失效 list模拟实现 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向…

电容隔离型±10V输入隔离放大器特点:ISOC 124P

产品特点: 50KHz(-3dB)高带宽与ISO 124P隔离器Pin-Pin兼容 低成本小体积&#xff0c;标准DIP16Pin阻燃材料封装 精度等级:0.01级&#xff0c;全量程内非线性度0.01% 信号输入与输出之间:3000VDC隔离耐压 电源范围:4.5V~18V 双极运算:Vo10V 方便易用&#xff0c;固定单位增益配置…

ubuntu安装nginx以及开启文件服务器

1. 下载源码 下载页面&#xff1a;https://nginx.org/en/download.html 下载地址&#xff1a;https://nginx.org/download/nginx-1.24.0.tar.gz curl -O https://nginx.org/download/nginx-1.24.0.tar.gz2. 依赖配置 sudo apt install gcc make libpcre3-dev zlib1g-dev ope…

【分治算法】Strassen矩阵乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 Strassen算法时间复杂性 问题时间复杂性Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 A A A和 B B B是两个 n n n \times n nn矩阵&#xff0c; A A…

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线&#xff0c;选择模板 2.添加流水线源&#xff0c;及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试&#xff0c;这个步骤可以不用动它. 4. …

gcc/g++:预编译阶段寻找头文件

预编译阶段寻找头文件大致可分为两种情况&#xff1a;1&#xff09;系统头文件&#xff0c;2&#xff09;用户头文件。 示例&#xff1a; 1&#xff09;用户头文件 /*brief design and implements of demo-for-precompile-to-include.author wenxuanpeiemail 15873152445163.…

AI的力量感受(附网址)

输入 科技感的 二维码&#xff0c;生成如下&#xff0c;还是可以的 输入金属感 的芯片&#xff0c;效果就很好了 金属感 打印机&#xff0c;细节丰富&#xff0c;丁达尔效应 就有点跑题了 金属感 扫码仪 还有点像 3D 封装长这样&#xff0c;跑题比较严重 总之&#xff0c;AI还…

如何使用生成式人工智能撰写关于新产品发布的文章?

利用生成式人工智能撰写新产品发布文章确实是一种既有创意又高效的内容生成方式。以下是如何做到这一点的指南&#xff0c;附带一些背景信息&#xff1a; • 背景&#xff1a;在撰写文章之前&#xff0c;收集有关您的新产品的信息。这包括产品的名称、类别、特点、优势、目标受…

朗汀留学美国生物医学工程专业留学部分录取案例合集

满怀期待的憧憬与金榜题名的喜悦交织着未来的掌声&#xff0c;捧在手心里的不仅仅是一份一份努力浇灌的录取通知&#xff0c;更是一起拼搏走过的岁月沉淀。 我们感恩每一位朗汀留学的学生和家长&#xff0c;是你们的支持与信任&#xff0c;让我们有机会共享此刻的荣耀&#xff…

数据挖掘及其近年来研究热点介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

jdk目录结构

jdk目录详解 JDK(Java Development Kit&#xff0c;Java开发包&#xff0c;Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者 编译&#xff0c;调试和运行用Java语言写的applet和应用程序所需的工具组成。 JDK(J…

【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

通过 ffmpeg命令行 调节视频播放速度

1. 仅调整视频速率 视频调速原理&#xff1a;修改视频的pts&#xff0c;dts # 可能会丢帧 ffmpeg -i input.mkv -an -filter:v "setpts0.5*PTS" output.mkv # 可用-r参数指定输出视频FPS以防止丢帧 ffmpeg -i input.mkv -an -r 60 -filter:v "setpts2.0*PTS&q…

redis的HyperLogLogs详细介绍

Redis的HyperLogLogs是一种概率数据结构&#xff0c;用于估计集合中的元素个数&#xff0c;即基数。即使存储了超大数据&#xff08;超过2^64的基数&#xff09;的集合&#xff0c;HyperLogLogs也只需要12KB的内存&#xff0c;所有这使得其非常适合做大规模数据的去重计数。 H…

MySQL | 如何使用mysqldumpslow命令进行SQL慢查询分析?

关注WX&#xff1a;CodingTechWork 介绍 启用慢查询日志 编辑 MySQL 配置文件&#xff1a;打开 MySQL 的配置文件&#xff08;通常是 my.cnf 或 my.ini&#xff09;。 启用慢查询日志&#xff1a;找到以下配置项并进行设置&#xff1a; slow_query_log 1 # 启用…