目录
4.4 在启动类上添加@EnableDiscoveryClient注解启动即可注册到注册中心上
前言
Nacos是阿里巴巴开发的动态服务发现和配置管理平台。它代表“命名和配置服务”,旨在简化分布式环境中微服务的管理和配置。
1、为什么叫Nacos?
Nacos:Dynamic Naming and Configuration Service,翻译为动态命名和配置服务。
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
2、详细学习请参考文档如下
官网:home
Spring Cloud阿里巴巴参考文档 :Spring Cloud Alibaba Reference Documentation
下载地址:Releases · alibaba/nacos · GitHub
快速上手:Nacos 快速开始
- 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
- 架构大图:通过清晰架构,让您快速进入 Nacos 世界
- 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
- 生态大图:系统梳理 Nacos 和主流技术生态的关系
- 优势大图:展示 Nacos 核心竞争力
- 战略大图:要从战略到战术层面讲 Nacos 的宏观优势
3、同类产品对比
对比项目\注册中心 | Spring Cloud Nacos | Spring Cloud Eureka |
---|---|---|
CAP模型 | 支持AP和CP模型 | AP模型 |
客户端更新服务信息 | 使用注册+DNS-f+健康检查模式。 DNS-F客户端使用监听模式push/pull拉取更新信息 | 客户端定时轮询服务端获取其他服务ip信息并对比,相比之下服务端压力较大、延迟较大 |
伸缩性 | 使用Raft选举算法性能、可用性、容错性均比较好,新加入节点无需与所有节点互相广播同步信息 | 由于使用广播同步信息,集群超过1000台机器后对eureka集群压力很大 |
健康检查模式/方式 | 支持服务端/客户端/关闭检查模式,检查方式有tcp、http、sql。支持自己构建健康检查器 | 客户端向服务端发送http心跳 |
负载均衡 | 支持 | 支持 |
手动上下线服务方式 | 通过控制台页面和API | 通过调用API |
跨中心同步 | 支持 | 不支持 |
k8s集成 | 支持 | 不支持 |
分组 | Nacos可用根据业务和环境进行分组管理 | 不支持 |
权重 | Nacos默认提供权重设置功能,调整承载流量压力 | 不支持 |
厂商 | 阿里巴巴 | Netflix |
4、使用Nacos充当注册中心
4.1 Nacos服务的启动
首先我们解压下载后的zip压缩包,在windows启动进入到bin目录下点击startup.cmd启动Nacos。
linux 上启动 sh startup.sh 即可启动
启动成功效果图如下
访问Http://127.0.0.1:8848/nacos,用户名和密码均为nacos 。登录成功效果如下
注意:一定要加上nacos ,否则路径找不到奥。
4.2引入Nacos注册中心依赖
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.3 在yml文件中添加注册中心配置如下:
# Tomcat
server:
port: 9200
# Spring
spring:
application:
# 应用名称
name: serviceName
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
4.4 在启动类上添加@EnableDiscoveryClient注解启动即可注册到注册中心上
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class UserCenterAuthApplication
{
public static void main(String[] args)
{
SpringApplication.run(UserCenterAuthApplication.class, args);
}
@EnableDiscoveryClient 的作用都是能够让注册中心发现、并扫描到该服务。
@EnableDiscoveryClient
-
用途:该注解用于指示Spring Boot在应用程序中启用服务发现功能。当您使用此注释时,Spring Boot 将尝试使用所选的服务注册表注册应用程序,并使其可以被同一生态系统中的其他服务发现。
-
用法:要使用
@EnableDiscoveryClient
,您需要在类路径上包含 Spring Cloud 依赖项和适当的服务注册表实现。例如,如果您想使用 Eureka 进行服务发现,您应该spring-cloud-starter-netflix-eureka-client
在项目中包含依赖项。 -
兼容性:
@EnableDiscoveryClient
兼容各种服务发现实现,包括Eureka、Consul、Nacos等。通过使用此注释,您可以轻松地在不同的服务注册表实现之间切换,而无需更改大量代码。
@EnableDiscoveryClient
2.和之间的区别@EnableEurekaClient
:
-
@EnableDiscoveryClient
:如前所述,该注解是 Spring Cloud Netflix 模块的一部分,兼容多种服务发现实现,包括 Eureka、Consul 和 Nacos。它提供了一种启用服务发现的通用方法,使您的应用程序独立于底层服务注册表。 -
@EnableEurekaClient
:该注解是Eureka服务注册中心特有的。它也是 Spring Cloud Netflix 模块的一部分,当您想要专门向 Eureka 服务注册表注册您的应用程序时,可以使用它。如果您使用 Eureka 作为服务注册中心,则可以使用@EnableEurekaClient
来启用 Eureka 特定的功能。
总之, 和@EnableDiscoveryClient
都@EnableEurekaClient
用于 Spring Boot 应用程序中的服务发现目的。关键区别在于,它@EnableDiscoveryClient
提供了更通用的方法并可与多个服务注册表实现一起使用,而@EnableEurekaClient
特定于 Eureka,只能在您使用 Eureka 作为服务注册表时使用。如果你想让你的应用程序保持灵活并且独立于服务注册中心,@EnableDiscoveryClient
是首选。
注意:
从 SpringCloud Edgware 版本开始, @EnableEurekaClient 和 @EnableDiscoveryClient 注解都可以省略了,只需要在 pom.xml 中引入依赖、在application.yml 上进行相关配置,就可以将微服务注册到注册中心上。但是为了起标识作用,最好还是加上 @EnableDiscoveryClient 注解。
4.5 Nacos注册成功效果图
服务名等同于配置中application.name
4.6增加轮询配置
由于我们在开发中,经常是以服务名的方式去调用,而不是以IP+端口的方式去调用,这样我们就会不知道要找哪个服务,所以我们要开启负载均衡。代码如下
@LoadBalanced
:这个注解用来修饰RestTemplate
bean的定义,它表明beanRestTemplate
应该是负载均衡的。当您使用此注解时,Spring Cloud 将自动注入负载均衡版本的RestTemplate
,允许您使用服务名称(逻辑名称)而不是硬编码的 URL。
@Retryable
:虽然与负载平衡没有直接关系,但该@Retryable
注释可用于RestTemplate
定义发出 HTTP 请求时的重试行为。如果请求由于暂时的网络问题而失败,@Retryable
注释将自动重试请求一定次数。
RestTemplate
当用于服务之间的通信时,这两种注释在增强分布式环境中微服务的弹性和可扩展性方面发挥着重要作用。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
4.7 服务之间调用案例 restTemplate
@RestController
@Slf4j
public class OrderController {
//调用支付订单服务端的ip+端口号
public static final String PAYMENT_URL = "http://serviceName";
@Autowired
private RestTemplate restTemplate;
//创建支付订单的接口
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment, CommonResult.class);
}
//获取id获取支付订单
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
}
FeignClient方式调用,稍后详解
@FeignClient(contextId = "feignTestService",value = "cloud-consumer-service",fallbackFactory = FeignTestFallbackFactory.class)
public interface FeignTestService {
@PostMapping("/test/feignTest")
void feignTest();
}
本次SpringCloudAlibaba之注册中心Nacos就到这里,有问题欢迎留言。感谢评论收藏加关注!