一、Nacos-注册中心
介绍:
集成在Spring cloud alibaba中,因为是阿里开发的所以学他,有中文文档
为什么要使用他,我们的请求路径的端口号一旦写死了,当连接到的端口号报销了,崩溃了,这整个服务都挂了,解决方式, 那我们就不让他的端口号写死,使用注册中心,从注册中心中拿到根据负载均衡算法获取到的端口号,目的是不让服务的调用者面向服务的提供者,让他们两个都面向注册中心
注册中心大致介绍
1.服务提供者
面向注册中心,在注册中心注册服务
1) 注册中心
面对服务提供者,提供心跳续约服务,{当哪一个端口突然停止服务了,他就会通知服务中心}
2) 使用服务注册
1.引入依赖
<!--引入nacos的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.配置地址
spring:
cloud:
nacos:
server-addr: 你的虚拟机地址:8848
然后服务会发现服务一启动就被注册了
2.服务调用者
面向注册中心,在注册中心订阅服务提供者信息,
我怎么在注册中心给我的那么多的服务提供者给出的服务中选则呢,那就会用到负载均衡算法啦
这就达到了远程调用服务提供者的服务啦
1) 注册中心
面对服务调用者,提供推送变更服务,{当服务中心检测到有提供者的服务挂掉后就会同步调用者可以调用的服务}
2) 也就是服务发现
1.引入依赖
<!--引入nacos的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.配置地址
spring:
cloud:
nacos:
server-addr: 你的虚拟机地址:8848
3.服务发现
1.根据服务名称在服务列表拉取服务的实例列表
你需要去nacos里获取服务列表所以你得需要去使用一个接口DiscoveryClient,
private final DiscoveryClient discoveryClient;
private final RestTemplate restTemplate;
//根据服务名称获取服务的实例
List<ServiceInstance> instances=discoveryClient.getInstances("服务名称")
if(Collutil.isEmpty(instances)){
return; //判断集合是否为空 为空是true 跳出方法
}
//手写一个负载均衡从实例列表中挑选一个实例
ServiceInstance instance=instances.get(Randomutil.randomInt(instances.size()))
//利用RestTemplate发起http请求,得到http响应
ResponseEntity<List<实体DTO>> respon=restTemplate.exchang(
instance.getUrl()+"参数",
HttpMod.GET/POST,
RequestEntity,
new ParameterizedTypeReference(<List<DTO>>){},//字节码的泛型会被擦除,对象的泛型
Map.of()
)
然后从响应体中拿到想要的数据
3) Docker中部署
但是需要修改一个配置文件 nacos/custom.env
MYSQL_SERVICE_HOST=你的虚拟机的ip
用户名与密码修改 成自己的
然后在Docker中运行Nacos镜像
docker -run -d \
--name nacos \
--env -file ./nacos/custom.env \
-p 8848:8848 \
-P 9848:9848 \
--restart=always \
nacos/nacos-service:v2.1.0-slim
启动完成后访问http://你的虚拟机ip:8848/nacos/ 首次访问都会跳到登录页面,账号密码都是nacos
二、OpenFegin
介绍是一个声明式的http客户端
使用OpenFegin
1.引入依赖
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.使用注解 @EnableFeignClients
@EnableFeignClients //通过@EnableFeignClients启用OpenFegin功能
public class NameApplication{
}
实现
@FeignClient(value="服务名称")
public interface ItemClient{
@GetMapping("路径")
List<DTO> queryItemByIds(@RequestParam("参数"), Collection<Object> ids);
}
未完待续······