一 、注册中心原理
在微服务架构中,注册中心是最核心的基础服务之一
二、注册中心主要涉及到三大角色:
服务提供者 ---生产者
服务消费者 ---
服务发现与注册
它们之间的关系大致如下:
各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。
服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。
各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。
微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。
三、常见的注册中心
1.Zookeeper
zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式
应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用
配置项的管理等。
2.Eureka
Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭
源
3.Consul
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现
和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value
存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以
安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
4.Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring
Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。
四、Nacos简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速
实现动态服务发现、服务配置、服务元数据及流量管理。
从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务
五、安装Nacos
1.下载Nacos
下载zip格式的安装包,然后进行解压缩操作
1.4.1的下载地址是:
2.使用nacos
在windows里面 进入bin目录里面
执行一个命令 startup.cmd -m standalone
执行成功如下图:
通过localhost:8848/nacos登录访问
如图所示配置成功。
3.将服务注册到注册中心
1.在项目pom文件里加入依赖
代码如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 微服务注册到nacos
代码如下:
将对应的服务注册到注册中心里面
# 注册到注册中心里面 localhost:8848
# nacos 服务的地址在哪里
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 微服务的名字
spring.application.name=order
如果微服务的IP地址显示的是以1 为最后一位的话 直接将对应的虚拟机的网卡禁用即可
禁用下图中两个
注解的作用是 当前的微服务可以被nacos发现
微服务里面写两个一模一样的项目(端口号不一样)注册到nacos里面
如上图所示,配置成功
六、负载均衡
1.什么是负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上 进行执行。
2.使用负载均衡
Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进
使用的时候必须加jar
代码如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
3.轮询代码
@Resource
private LoadBalancerClient loadBalancerClient;
// 根据服务的名字获取服务的网络的信息
@GetMapping("addOrder2/{pid}")
public Object addOrder2(@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);
// 1. 根据pid 得到商品的信息
Product forObject = restTemplate.getForObject(url, Product.class);
// 实现远程的调用
// map
// product : 分布式部署
// localhost:8083 pro
// 思考82 和83 之前进行轮询调用
return forObject;
}
4.随机
@Resource
private DiscoveryClient discoveryClient;// 发现客户端
@GetMapping("addOrder3/{pid}")
public Object addOrder3(@PathVariable Integer pid){
List<ServiceInstance> pro = discoveryClient.getInstances("pro");
//
int size = pro.size();
//
int i = new Random().nextInt(size);// =size-1
ServiceInstance choose = pro.get(i);
String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
System.out.println("*****"+url);
// 1. 根据pid 得到商品的信息
Product forObject = restTemplate.getForObject(url, Product.class);
// 实现远程的调用
// map
// product : 分布式部署
// localhost:8083 pro
// 思考82 和83 之前进行轮询调用
return forObject;
}
七、OpenFeign 组件之间的调用
默认负载均衡的策略就是一个轮询
1.加jar
<!--使用openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.开始使用openfeign
启动类上面开启使用openfeign
3.微服务之间的调用
4.Controller调用
@Resource
private ProFeign proFeign;
@GetMapping("feignOrder/{id}")
public Product getProById(@PathVariable Integer id){
Product proById = proFeign.getProById(id);
return proById;
}
5.更改策略:
5.1加配置文件
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.2在启动类上加注解使用这个策略
前面箭头是服务的名字,后面箭头是服务的类
5.3启动微服务调用一下路径
5.4服务熔断:
5.4.1加jar
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
5.4.2写一个实现类
package com.example.service;
import com.example.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
@Service
public class ProFeignImpl implements ProFeign {
@Override
public Product getProById(Integer id) {
return new Product(0,"出错啦");
}
}
5.4.3之前的接口上加一个fallback
5.4.4开启feign对sentinel的支持
在消费者的application.properties文件里面加上如下代码:
feign.sentinel.enabled=true
八、注意事项
要求JDK1.8及以上!!!