【后端开发】尚硅谷 SpringCloud 学习笔记

news/2024/11/7 12:38:02/

文章目录

  • 一、cloud组件
  • 二、环境搭建
    • 2.1 创建父工程
    • 2.2 支付模块构建
    • 2.3 消费者模块构建
      • 2.3.1 引入RestTemplate
      • 2.3.2 远程调用支付模块
  • 三、Eureka
    • 3.1 基础知识
    • 3.2 单机版Eureka安装
    • 3.3 服务注册
    • 3.4 Eureka集群
      • 3.4.1 Eureka端配置
      • 3.4.2 微服务端配置
      • 3.4.3 restTemplate负载均衡
      • 3.4.4 主机名修改和ip地址显示
    • 3.5 服务发现Discovery
    • 3.6 Rureka自我保护机制
    • 3.7 禁止Eureka自我保护
  • 四、Zookeeper
  • 五、Consul
    • 5.1 简介
    • 5.2 安装
    • 5.3 搭建项目
  • 六、三个注册中心的异同点
  • 七、Ribbon
    • 7.1 入门介绍
    • 7.2 使用Ribbon
    • 7.3 RestTemplate类
    • 7.4 Ribbon常用负载均衡算法
    • 7.5 Ribbon负载均衡规则替换
    • 7.6 轮询算法原理
    • 7.7 源码分析
    • 7.8 手写轮询算法
  • 八、OpenFeign
    • 8.1 什么是OpenFeign
    • 8.2 OpenFeign服务调用


一、cloud组件

image-20220420215503372

二、环境搭建

2.1 创建父工程

image-20220420221138947

2.2 支付模块构建

image-20220420223559508

2.3 消费者模块构建

2.3.1 引入RestTemplate

@Configuration
public class ApplicationContextConfig {// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,// 需要在配置文件配置之后,代码中才可以依赖注入// 当前文件就是spring的配置文件@Bean
//    @LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力  //将此注解注释掉,使用自己的轮询算法不使用默认的public RestTemplate getRestTemplate() {return new RestTemplate();}
}

2.3.2 远程调用支付模块

@RestController
public class OrderController {public static final String PAYMENT_URL = "http://localhost:8001";public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";@Resourceprivate RestTemplate restTemplate;@GetMapping("/testRPC/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") String id) {return restTemplate.getForObject(PAYMENT_URL + "/test/" + id, CommonResult.class);}}

三、Eureka

3.1 基础知识

前面我们没有服务注册中心,也可以服务间调用,为什么还要服务注册?

当服务很多时,单靠代码手动管理是很麻烦的,需要一个公共组件,统一管理多服务,包括服务是否正常运行,等

Eureka用于**服务注册,目前官网已经停止更新**

3.2 单机版Eureka安装

image-20220421135836067

创建项目cloud-eureka-server-7001

引入依赖

<dependencies><!-- 服务注册中心的服务端 eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies>

yml配置文件

server:port: 7001# 单机版
eureka:instance:hostname: localhost  #eureka服务端的实例名字client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}

启动类

/*** @author WSKH* @date 2020/12/19 14:12* @description 注册中心*/
@SpringBootApplication
@EnableEurekaServer // 启动Eureka服务
public class CloudEurekaServer7001Application {public static void main(String[] args) {SpringApplication.run(CloudEurekaServer7001Application.class, args);System.out.println("启动成功!");}
}

3.3 服务注册

引入依赖

<!-- 服务注册中心的客户端端 eureka-client -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

yaml配置

server:port: 8001spring:application:name: cloud-payment-serviceeureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:#      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001 #单机版instance:instance-id: payment8001prefer-ip-address: true  #访问路径可以显示IP地址
#    Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
#    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
#    lease-expiration-duration-in-seconds: 2

启动类

@SpringBootApplication
@EnableEurekaClient // 指定成为Eureka客户端
@EnableDiscoveryClient // 开启服务发现
@Slf4j
public class CloudProviderPayment8001Application {public static void main(String[] args) {SpringApplication.run(CloudProviderPayment8001Application.class, args);log.info("cloud-provider-payment-8001 启动成功!");}
}

3.4 Eureka集群

单机版注册中心会出现单点故障,故一般都采用集群

image-20220421142643610

两台或以上的Rureka互相注册,相互守望,对外暴露端口

3.4.1 Eureka端配置

image-20220421142246104

7001的yaml配置

server:port: 7001#集群版
eureka:instance:hostname: eureka7001    #eureka服务端的实例名字(实际好像不起作用,DS Replicas是直接截取URL中冒号前面的部分,当作队友名,如http://localhost:7001,那就截取localhost当作队友名)client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
#      defaultZone: http://eureka7001.com:7001defaultZone: http://localhost:7002  #这个是集群版开启 互相注册
#  server:
##    关闭自我保护机制,保证不可用服务被及时踢除
#    enable-self-preservation: false
#    eviction-interval-timer-in-ms: 2000

7002的yaml配置

server:port: 7002#集群版
eureka:instance:hostname: eureka7002    #eureka服务端的实例名字(实际好像不起作用,DS Replicas是直接截取URL中冒号前面的部分,当作队友名,如http://localhost:7001,那就截取localhost当作队友名)client:register-with-eureka: false    #表识不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001

3.4.2 微服务端配置

image-20220421142428598

server:port: 80spring:application:name: cloud-order-serviceeureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001,http://localhost:7002  #集群版

image-20220421142518868

server:port: 8001spring:application:name: cloud-payment-serviceeureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:#      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001,http://localhost:7002  #集群版instance:instance-id: payment8001prefer-ip-address: true  #访问路径可以显示IP地址
#    Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
#    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
#    lease-expiration-duration-in-seconds: 2

image-20220421144600272

3.4.3 restTemplate负载均衡

加入@LoadBalanced注解即可开启负载均衡

@Configuration
public class ApplicationContextConfig {// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,// 需要在配置文件配置之后,代码中才可以依赖注入// 当前文件就是spring的配置文件@Bean@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力  //将此注解注释掉,使用自己的轮询算法不使用默认的public RestTemplate getRestTemplate() {return new RestTemplate();}
}

测试

@RestController
public class OrderController {// http://服务名大写public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";@Resourceprivate RestTemplate restTemplate;@GetMapping("/testLoadBalancedRpc/{id}")public CommonResult<Payment> testLoadBalancedRpc(@PathVariable("id") String id) {return restTemplate.getForObject(PAYMENT_URL + "/test/"+id, CommonResult.class);}}

image-20220421150453650

最后发送请求 http://127.0.0.1:80/testLoadBalancedRpc/id=123 进行测试

发现会自动均衡地访问8001和8002

3.4.4 主机名修改和ip地址显示

image-20220421151024477

image-20220421151050724

3.5 服务发现Discovery

开启服务发现

image-20220421151614870

使用DiscoveryClient完成服务发现

// 注入DiscoveryClient对象
@Resource
DiscoveryClient discoveryClient;@GetMapping("/testDiscoveryClient")
public void testDiscoveryClient(){// 从注册中心获取所有服务的名称List<String> services = discoveryClient.getServices();services.forEach(System.out::println);// 根据服务名称找到其下的所有实例List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");// 遍历输出实例信息instances.forEach(instance -> {System.out.println(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());});
}

测试 http://127.0.0.1:8001/testDiscoveryClient

image-20220421151934129

3.6 Rureka自我保护机制

image-20220421152240967

image-20220421152305485

image-20220421152553928

image-20220421152705265

image-20220421152733179

3.7 禁止Eureka自我保护

image-20220421152930424

#集群版
eureka:instance:hostname: eureka7001    #eureka服务端的实例名字client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
#      defaultZone: http://eureka7001.com:7001/eureka/defaultZone: http://localhost:7002  #这个是集群版开启 互相注册
#  server:
##    关闭自我保护机制,保证不可用服务被及时踢除
#    enable-self-preservation: false
#    eviction-interval-timer-in-ms: 2000

image-20220421153115868

四、Zookeeper

五、Consul

5.1 简介

image-20220423190903685

image-20220423190923102

5.2 安装

中文官网: https://www.spring.cloud.cc/spring-cloud-consul.html

英文官网:https://www.consul.io

需要下载一个安装包

image-20220423192943494

查看版本

image-20220423193722948

启动是一个命令行界面,需要输入consul agent -dev启动

http://localhost:8500

image-20220423194820358

5.3 搭建项目

引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

yaml配置

server:port: 8006spring:application:name: consul-provider-paymentcloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}

启动类

@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class CloudProviderconsulPayment8006Application {public static void main(String[] args) {SpringApplication.run(CloudProviderconsulPayment8006Application.class, args);System.out.println("启动成功");}}

启动App,查看服务注册情况

六、三个注册中心的异同点

image-20220423200325820

七、Ribbon

7.1 入门介绍

image-20220423201010799

image-20220423201229679

7.2 使用Ribbon

默认我们使用eureka的新版本时,它默认集成了ribbon:

image-20220423201847659

这个starter中集成了reibbon了

我们也可以手动引入ribbon

7.3 RestTemplate类

image-20220423201929555

RestTemplate:xxxForObject()方法,返回的是响应体中的数据xxxForEntity()方法.返回的是entity对象,这个对象不仅仅包含响应体数据,还包含响应体信息(状态码等)

7.4 Ribbon常用负载均衡算法

IRule接口,Riboon使用该接口,根据特定算法从所有服务中,选择一个服务,

Rule接口有7个实现类,每个实现类代表一个负载均衡算法

image-20220423202655644

7.5 Ribbon负载均衡规则替换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqERrsdi-1686926847827)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220423202944560.png)]

image-20220423203006329

配置类

@Configuration
public class MySelfRule {@Beanpublic IRule myRule() {// 此处将ribbon默认使用的轮询策略改为随机策略return new RandomRule();}
}

启动类

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
// 启动CLOUD-PAYMENT-SERVICE服务时去加载自定义的ribbon配置
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
@Slf4j
public class CloudConsumerOrder80Application {public static void main(String[] args) {SpringApplication.run(CloudConsumerOrder80Application.class, args);log.info("cloud-consumer-order-80 启动成功!");}}

7.6 轮询算法原理

image-20220423203635111

7.7 源码分析

image-20220423203909554

image-20220423203934127

7.8 手写轮询算法

image-20220423213247841

public interface MyLoadBalancer {/*** 收集服务器总共有多少台能够提供服务的机器,并放到list里面** @param serviceInstances* @return ServiceInstance* @author WSKH* @date 2020/12/23 9:24*/ServiceInstance instances(List<ServiceInstance> serviceInstances);
}
@Component
public class MyLB implements MyLoadBalancer {// 原子类private final AtomicInteger atomicInteger = new AtomicInteger(0);/*** @author WSKH* @date 2020/12/23 10:07* @description 判断时第几次访问*/public final int getAndIncrement() {int current;String a = "current";int next = 0;do {current = atomicInteger.get();// 防止越界next = current >= Integer.MAX_VALUE ? 0 : current + 1;} while (!atomicInteger.compareAndSet(current, next));System.out.println("*****第几次访问,次数next: " + next);return next;}/*** 负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标, 每次服务重启动后rest接口计数从1开始。1** @param serviceInstances* @return ServiceInstance* @author WSKH* @date 2020/12/23 9:51*/@Overridepublic ServiceInstance instances(List<ServiceInstance> serviceInstances) {int index = getAndIncrement() % serviceInstances.size();return serviceInstances.get(index);}}
// 注入自定义的负载均衡规则
@Resource
private MyLoadBalancer myLoadBalancer;@Resource
private DiscoveryClient discoveryClient;
/*** @author WSKH* @date 2020/12/23 10:27* @description 测试自定义的负载均衡规则*/
@GetMapping(value = "/payment/lb")
public String getPaymentLB() {List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");if (instances == null || instances.isEmpty()) {return null;}// 调用自定义的负载均衡策略ServiceInstance serviceInstance = myLoadBalancer.instances(instances);URI uri = serviceInstance.getUri();return restTemplate.getForObject(uri + "/payment/lb", String.class);}

八、OpenFeign

8.1 什么是OpenFeign

image-20220530091905945

image-20220530092051129

image-20220530092209979

8.2 OpenFeign服务调用

未完待续...


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

相关文章

qma7981 源码 驱动_高品质PCB板配单报价,QMA7981-TR

高品质PCB板配单报价 【新巨福电子】深圳新巨福电子有限公司的主打产品有法国施耐德(Schneider)&#xff1a;低压开关、ATV系列变频器等工控产器&#xff1b;法国“溯高美”(SOCOMEC)&#xff1a;ATYS系列双电源转换开关和A系列多功能电力仪表&#xff1b;台湾“新巨”(ZIPPY)&…

转换开关的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

报告页数: 150 图表数: 100 报告价格&#xff1a;16800 本文研究全球与中国市场转换开关的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析转换开关的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规…

实时数据库:优势和报价

1参考资料 &#xff08;1&#xff09;实时数据库简介, http://blog.csdn.net/liqfyiyi/article/details/6862886 &#xff08;2&#xff09;实时数据库简介和比较&#xff0c; http://www.cnblogs.com/zljini/archive/2006/05/17/402422.html &#xff08;3&#xff09;实时数据…

高端PLC性能和价格必定匹配。

在讨论PLC开放性的同时&#xff0c;我们也需要考虑网络。自动化未来10年的主要战场将在通讯协议层面上。Profinet、Ethernet/IP、Ethercat和Powerlink等协议正在争夺市场份额。这两个阵营分别是基于标准TCP/IP和标准TCP/IP协议栈的。刚好&#xff0c;我总结了一些嵌入式资料放在…

【技术新趋势】面向图像文档的版面智能分析与理解

目录 一、什么是OCR&#xff1f;什么是版面分析理解&#xff1f;二、文档版面分析2.1、版面布局类型2.2、面向文档图像版面分析的实例分割2.3、逻辑结构分析 三、文档版面理解3.1、位置嵌入3.2、表格数据提取 四、智能文档处理技术新解决方案 人类撰写文档是为了记录和保存信息…

smart-UPS RT 15000串口通讯线的线序测量

前言 现场有一台APC(施耐德) smart-UPS RT 15000的UPS, 上面有DB9的RS232串口通讯口(用来和超级终端通讯&#xff0c;设置设备通讯参数)&#xff0c;开始没问厂家&#xff0c;直接用RS232转USB的公版线插上去实验&#xff0c;UPS直接停电了。后来测试&#xff0c;这条232转USB…

vectorvn1610报价_意大利Vector 通讯模块

业可优势品牌 TEMPCONTROL 业可优势品牌 FERRAZSHAWNUT 业可优势品牌 SNT(FRANCE) 业可优势品牌 EPPENSTEINER GMBH 业可优势品牌 VUOTOTECNICA 业可优势品牌 TCL 业可优势品牌 美国virtual 业可优势品牌 SIRENA 业可优势品牌 IHNE&TESCH 业可优势品牌 Samson 业可优势品牌…

2022年全球及中国设备漏电断路器行业头部企业市场占有率及排名调研报告

本文调研和分析全球设备漏电断路器发展现状及未来趋势&#xff0c;核心内容如下&#xff1a; &#xff08;1&#xff09;全球市场总体规模&#xff0c;分别按销量和按收入进行了统计分析&#xff0c;历史数据2017-2021年&#xff0c;预测数据2022至2028年。 &#xff08;2&…