目录
一、Nacos简介
二、安装并运行Nacos
三、Nacos作为服务注册中心演示
(一)基于Nacos的服务提供者
(二)基于Nacos的服务消费者
(三)服务注册中心对比
Nacos 支持AP和CP模式的切换
(一)为什么叫Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
(二)是什么
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
即注册中心+配置中心的组合(Nacos = Eureka+Config +Bus)
(三)能干吗
替代Eureka做服务注册中心
替代Config做服务配置中心
(四)去哪下
github:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
官网文档:Spring Cloud Alibaba Reference Documentation (spring-cloud-alibaba-group.github.io)
home (nacos.io)
(五)各种注册中心比较
本地Java8+Maven环境已经OK
进入官网,点击左上角的tag找到对应版本即可
Releases · alibaba/nacos · GitHub
解压安装包,直接运行bin目录下的startup.cmd,目录结构
命令运行成功后直接访问http://localhost:8848/nacos 用户密码都是nacos
官方文档:Spring Cloud Alibaba Reference Documentation
新建module cloudalibaba-provider-payment9001
父POM
4.0.0
com.atguigu.springcloud
mscloud
1.0-SNAPSHOT
pom
cloud-eureka-server7001
cloud-eureka-server7002
cloud-eureka-server7003
cloud-provider-payment8001
cloud-provider-payment8002
cloud-providerzk-server8004
cloud-providerzk-server8005
cloud-consumer-order80
cloud-consumerzk-order81
cloud-providerconsul-payment8006
cloud-consumerconsul-order82
cloud-providerconsul-payment8007
cloud-provider-payment8003
cloud-consumer-feign-order80
cloud-provider-hystrix-payment8001
cloud-consumer-hystrix-dashboard9001
cloud-zuul-gateway9527
cloud-provider-sms8008
mytest
cloud-config-center-3344
cloud-config-client-3355
cloud-conumser-feign-order2001
cloud-provider-hystrix-payment2701
cloud-provider-hystrix-payment2702
cloud-config-client-3366
cloud-stream-rabbitmq-provider8801
cloud-stream-rabbitmq-consumer8802
cloud-gateway-gateway9588
cloudalibaba-provider-payment9001
cloudalibaba-provider-payment9002
UTF-8
1.8
1.8
4.12
1.2.17
1.16.18
org.springframework.boot
spring-boot-dependencies
2.1.9.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR3
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
mysql
mysql-connector-java
5.1.47
com.alibaba
druid
1.1.16
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
junit
junit
${junit.version}
log4j
log4j
${log4j.version}
org.projectlombok
lombok
${lombok.version}
true
org.springframework.boot
spring-boot-maven-plugin
true
true
本工程POM
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
YML
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
主启动加上@EnableDisconveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001
{
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
业务类
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
测试
http://localhost:9001/payment/nacos/1
为了演示负载均衡,照搬9001新建9002
新建module cloudalibaba-consumer-nacos-order83
POM
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.atguigu.springcloud
cloud-api-commons
${project.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
为什么nacos支持负载均衡?
YML
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}
ApplicationContextBean
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
OrderNacosController
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
nacos控制台
测试
http://localhost:83/consumer/payment/nacos/13
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
nacos可通过以下代码转换模式
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'