在了解Nacos注册配置中心之前,先了解一下Spring Cloud的相关基础组件有那些
- 服务发现——Netflix Eureka (Nacos)
- 服务调用——Netflix Feign
- 熔断器——Netflix Hystrix
- 服务网关——Spring Cloud GateWay
- 分布式配置——Spring Cloud Config (Nacos)
- 消息总线 —— Spring Cloud Bus (Nacos)
相关介绍
- Eureka:个服务启动时,Eureka会将服务注册到EurekaService,并且EurakeClient还可以返回过来从EurekaService拉去注册表,从而知道服务在哪里
- Ribbon:服务间发起请求的时候,基于Ribbon服务做到负载均衡,从一个服务的对台机器中选择一台
- Feign:基于fegin的动态代理机制,根据注解和选择机器,拼接Url地址,发起请求
- Hystrix:发起的请求是通过Hystrix的线程池来走,不同的服走不同的线程池,实现了不同的服务调度隔离,避免服务雪崩的问题
- Zuul/GateWay :如果前端后端移动端调用后台系统,统一走zull网关进入,有zull网关转发请求给对应的服务
一:nacso
1:基本概念
(1)英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心作者。Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
(2)常见的注册中心:
1. Eureka(原生)
2. Zookeeper(支持,专业的独立产品。例如:dubbo)
3. Consul(原生,GO语言开发)
4. Nacos
相对于 Spring Cloud Eureka 来说,Nacos 更强大。Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
二、Nacos原理
(1)Nacos地图
(1)Nacos结构图
(1)nacos介绍
(2)nacos服务领域模型
(3)Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。
Nacos主要提供以下四大功能:
1. 服务发现和服务健康监测
2. 动态配置服务
3. 动态DNS服务
4. 服务及其元数据管理
(4)注册中心原理
服务注册方法:以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。
(5) 配置中心原理
三、Nacos下载和安装
(1)下载地址和版本
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.1.4.tar.gz或nacos-server-1.1.4.zip,解压任意目录即可
(2)启动nacos服务
- Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式)
启动命令:sh startup.sh -m standalone
- Windows
启动命令:cmd startup.cmd 或者双击startup.cmd运行文件。
访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
二、服务注册
1:配置Nacos客户端的pom依赖
<!--配置锁定依赖的版本-->
<dependencyManagement>
<dependencies>
<!--Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
<!--ribbon 负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--hystrix(熔断器)依赖,主要是用 @HystrixCommand -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--Nacos组件 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Feign组件 服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、添加服务配置信息
配置application.properties,在客户端微服务中添加注册Nacos服务的配置信息
# 服务名(同时为nacos注册的服务名称)
spring.application.name=service-edu
#springcloud的Nacos 注册中心配置
#Nacos服务地址(本地服务是:127.0.0.1)(部署后需要换成部署的服务器地址)
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、添加Nacos客户端注解
在客户端微服务启动类中添加注解
@EnableDiscoveryClient
4、启动客户端微服务
1:启动注册中心
2:启动已注册的微服务,可以在Nacos服务列表中看到被注册的微服务
二、服务调用
1、在调用端的启动类添加注解
@EnableFeignClients
2、创建包和接口
创建client包
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@GetMapping注解用于对被调用的微服务进行地址映射。
@PathVariable注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入CodClient时idea报错
@Component
@FeignClient(name = "service-order")//@FeignClient(name = "服务名称")
public interface OrderClient {
//服务接口的全路径名称,使用@PathVariable需要注明参数名称,如:@PathVariable("courseId") String courseId
@GetMapping("/eduorder/order/isBuyCourse/{courseId}/{memberId}")
public boolean isBuyCourse(@PathVariable("courseId") String courseId, @PathVariable("memberId") String memberId);
}
3、调用微服务
@Autowired
private FeignToUcenterClient feignToUcenterClient;
@ApiOperation(value = "添加评论")
@PostMapping("addComment")
public R addComment(@RequestBody Comment comment, HttpServletRequest request) {
String memberId = JwtUtils.getMemberIdByJwtToken(request);//解析token字符串中的信息,获取id
if(StringUtils.isEmpty(memberId)) {//如果没有值,让用户先登录
return R.error().code(28004).message("请登录");
}
comment.setMemberId(memberId);//将用户id添加
UcenterMember ucenterMember = feignToUcenterClient.selectById(memberId);//调用feign接口,远程调用根据id获取用户信息
//将用户昵称和头像添加
comment.setNickname(ucenterMember.getNickname());
comment.setAvatar(ucenterMember.getAvatar());
commentService.save(comment);//执行添加操作
return R.ok();
相关连接