注册中心
1.注册中心涉及到的角色
- 服务提供者 ---生产者
- 服务消费者 ---
- 服务发现与注册
它们之间的关系大致如下:
- 各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。
- 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。
- 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。
- 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。
2.注册中心应具备功能
- 服务注册表
服务注册表是注册中心的核心,它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册与注销。 - 服务注册与发现
服务注册是指微服务在启动时,将自己的信息注册到注册中心的过程。服务发现是指查询可用的微服务列表及网络地址的机制。 - 服务检查
注册中心使用一定的机制定时检测已注册的服务,如发现某实例长时间无法访问,就会从服务注册表移除该实例。
客户端启动的时候,会开启一个线程,这个线程每过五秒钟调用自己发起心跳服务端也会有一个定时心跳检查任务,会周期性的隔一段时间检查一下,每一个实例有没有与自己保持心跳,如果没有直接删掉。心跳两边都有,客户端有,服务端也有
3.常见的注册中心
Zookeeper
zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式
应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用
配置项的管理等。
Eureka
Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭
源
Consul
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现
和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value
存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以
安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring
Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。
nacos简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速
实现动态服务发现、服务配置、服务元数据及流量管理。
从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务
nacos
1.下载 , 安装 , 启动
下载
下载地址: Releases · alibaba/nacos · GitHub
下载zip格式的安装包,然后进行解压缩操作
1.4.1的下载地址是:
https://github.com/alibaba/nacos/releases/tag/1.4.1
启动
进入bin目录
startup.cmd -m standalone Windows系统启动
sh startup.sh -m standalone Linux系统启动
启动成功
访问网址
账号 , 密码 均为 nacos
2.将服务注册到注册中心
1) 添加jar
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2) 注册服务
配置文件
启动nacos
注册成功
端口号 以 .1 结尾 会出现无法访问的情况
修改端口号
禁用虚拟机端口号
重启nacos 端口号修改
登录查看
3.整理架构
1)创建整合模块
2)修改架构提取公共部分
修改pom文件
3)将消费者和生产者文件添加到nacos中
启动
负载均衡
1. 什么是负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上 进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡
而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请 求
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供 者执行。
2.使用负载均衡
Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进
使用的时候必须加jar
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
1)轮询访问
配置
//引入负载均衡 @Resource private LoadBalancerClient loadBalancerClient; //根据服务名字获取微服务 @GetMapping("ord2/{pid}") public Object addOrd2(@PathVariable Integer pid){ ServiceInstance choose = loadBalancerClient.choose("pro"); String requestMsg = "方式二 GET 请求 RibbonServer"; String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid); System.out.println(url); Product product = restTemplate.getForObject(url, Product.class); return product; }
2)随机访问
@Resource //发现客户端 private DiscoveryClient discoveryClient; @GetMapping("ord3/{pid}") public Object addOrd3(@PathVariable Integer pid){ List<ServiceInstance> pro = discoveryClient.getInstances("pro"); int size = pro.size(); int i = new Random().nextInt(size); ServiceInstance choose = pro.get(i); String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid); System.out.println(url); Product product = restTemplate.getForObject(url, Product.class); return product; }
3.使用OpenFeign进行组件调用
1)引入jar
<!--使用openFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)在启动类上开启OpenFeign
3)创建接口
4)服务端
@Resource private DiscoveryClient discoveryClient; @Resource private ProFeign proFeign; @GetMapping("feigh/{id}") public Product getId(@PathVariable Integer id ){ Product feignId = proFeign.getId(id); return feignId; }
4.修改策略
配置文件
package com.example.config; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer; import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; public class LoadBalancerConfig { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name // 对应的需要进行负载均衡的名字是什么 System.out.println("======"+name); // product return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); } }
在启动类上加注解
访问
5.服务熔断
jar包
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
添加实现类
package com.example.service; import com.example.entity.Product; import org.springframework.stereotype.Service; @Service public class ProFeignImpl implements ProFeign{ @Override public Product getId(Integer id) { return new Product(0,"出错啦"); } }
修改接口
修改配置