1,什么是Nacos
Nacos 支持基于 DNS 和基于 RPC的服务发现(可以作为SpringCLoud的注册中心),动态配置服务(可以做配置中心),动态DNS服务。
官方这样介绍的:
Nacos 致力于帮助您发现,配置和管理微服务。Nacos提供 一组简单易用的特性集,帮助您快速实现动态服务发现,服务配置,服务元数据以及流量管理。
Nacos帮助您更敏捷和容易构建,交付和管理微服务平台。Nacos 是构建以 服务为中心的现代应用架构(例如微服务范式)的服务基础社设施
2,Nacos与Eureka有什么区别
分布式CAP理论告诉我们,Cp和AP不能同时满足
相比与Eureka:(1)Nacos具备服务优雅上下线和流量管理(API+后台管理页面),而Eureka的后台页面仅供展示,需要使用api操作上下线且不具备流量管理功能。
2,从部署上看,Nacos整合了注册中心,配置中心功能,把原来2套集群整合成一套,简化了部署维护。
(3),从长远来看Eureka开源工作已停止,后续不再更新和维护,而Nacos在以后的版本会支持SpringCloud+Kubermetes的组合,填补2着的鸿沟,在2套体系下可以采用同一套服务发现和配置管理的解决方案,这将大大的简化使用和维护成本。同时来说Nacos 计划实现Service Mesh,是未来微服务的趋势。
(4),从伸缩性和扩展性来看Nacos支持跨注册中心同步,而Eureka 不支持且在伸缩扩容方面,nacos比Eureka更(nacos 支持大数量级的集群)
(5)Nacos 具有分组隔离功能,一套Nacos可以支撑多项目,多环境。
阿里Nacos异常情况leader挂了
1,不影响服务之间互相调用
2,不影响服务注册
3,不影响服务正常启动拉取配置文件
4,选举新leader差不多4,5秒钟
3,Nacos与SpringCloud
3.1作为配置中心
下载nacos-server
https://github.com/alibaba/nacos/releases
启动过程参考官方文档:https://nacos.io/zh-cn/docs/quick-start.html
启动后登录: http://127.0.0.1:8848/nacos/index.html 用户名:nacos 密码:nacos
集成在SpringCloud项目中,引入pom
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.forezp
nacos-consumer
0.0.1-SNAPSHOT
nacos-consumer
Demo project for Spring Boot
1.8
Greenwich.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.9.0.RELEASE
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
application.yml如下:
server:
port: 8763
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
package com.taotao.nacos1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class Nacos1Application {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Nacos1Application.class, args);
}
}
在nacos控制台添加一个配置,参考官方文档,然后启动项目
构建服务消费者:nacos-consuer
和nacos-provider一样,构建服务消费者nacos-consumer,nacos-consumer的启动端口8763, 构建过程同nacos-provider 新建一个Spring Boot项目,Spring boot版本为2.1.4.RELEASE,Spring Cloud 版本为Greenwich.RELEASE,在pom文件引入nacos的Spring Cloud起步依赖,代码如下
集成在SpringCloud项目中,引入pom
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.forezp
nacos-consumer
0.0.1-SNAPSHOT
nacos-consumer
Demo project for Spring Boot
1.8
Greenwich.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.9.0.RELEASE
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
application.yml如下:
server:
port: 8764
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConsuerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsuerApplication.class, args);
}
}
验证服务注册的发现
分别启动工程,待工程启动成功后,在访问http://127.0.0.1:8848/nacos/index.html#/serviceManagement?dataId=&group=&appName=&namespace=&serverId=, 可以发现可以发现nacos-provider和nacos-consumer,均已经向nacos-server注册,如下图所示:
服务调用:
nacos作为服务注册和发现组建时,在进行服务消费,可以选择RestTemplate 和Feign等方式。这和使用Eureka和consul作为服务注册和发现的组件一样的,没有什么区别。这是因为Spring-cloud-starter-alibab-nacos-discovery依赖实现了Spring Cloud服务注册和发现的相关接口,可以和其他的服务注册发现组件无缝切换。
提供服务
在nacos-provider工程,写一个Controller提供API服务,代码如下:
package com.taotao.nacosconsuer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
Logger logger= LoggerFactory.getLogger(ProviderController.class);
@GetMapping("/hi")
public String hi(@RequestParam(value = "name",defaultValue = "forezp",required = false)String name){
return "hi "+name;
}
}
消费服务
在这里使用2种方式消费服务,一种是RestTemplate,一种是Feign。
使用RestTemplate消费服务
RestTemplate 可以用Ribbon作为负载均衡组件,在nacos-consumer 工程中引入ribbon的依赖:
org.springframework.cloud
spring-cloud-starter-ribbon
在Nacos1Application启动文件里注入Restemplate,:
package com.taotao.nacos1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Nacos1Application {
public static void main(String[] args) {
SpringApplication.run(Nacos1Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
加上@LoadBalanced注解可在RestTemplate上开启LoadBalance负载均衡的功能。
写一个消费服务的ConsumerController,代码如下:
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/hi-resttemplate")
public String hiResttemplate(){
return restTemplate.getForObject("http://nacos-provider/hi?name=resttemplate",String.class);
}
重启工程,在浏览器上访问:http://localhost:8763/hi-resttemplate,可以在浏览器上展示正确的响应,这时nacos-consumer调用nacos-provider服务成功。
FeignClient调用服务
在nacos-consumer的pom 文件引入一下的依赖
org.springframework.cloud
spring-cloud-starter-openfeign
在Nacos1Application启动文件上加上@EnableFeignClients注解开启FeignClient的功能。
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Nacos1Application {
public static void main(String[] args) {
SpringApplication.run(Nacos1Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
写一个FeignClient,调用nacos-provider的服务,代码如下:
package com.taotao.nacos1.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient("nacos-provider")
public interface ProviderClient {
@GetMapping("/hi")
String hi(@RequestParam(value = "name", defaultValue = "forezp", required = false) String name);
}
写一个消费API,该API使用ProviderClient来调用nacos-provider的API服务,代码如下:
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.hi("feign");
}
}
重启工程,再浏览器上访问http://localhost:8763/hi-feign,可以在浏览器上展示正确的响应,这时候nacos-consumer调用nacos-provider服务成功。
总结
本文比较详细的介绍了如何使用Nacos作为服务注册中心,并且使用案例介绍了如何在使用nacos作为服务注册中心时消费服务