nacos常被用做注册中心+配置中心,内集成ribbon等。原理什么的先不讲,下面直接看入门案例
nacos是可以ap、cp切换的,适用较多的场景。
一、nacos下载安装
https://github.com/alibaba/nacos/releases/tag/1.1.4(这里我安装的是1.1.4版本的)
解压安装包,直接运行bin目录下的startup.cmd
http://localhost:8848/nacos
默认账号密码都是nacos
二、nacos作为注册中心
基于Nacos的服务提供者
1.新建module cloudalibaba-provider-payment9001
2.pom.xml<!--父工程引入spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
<!--本pom.xml引入nacos--> <dependencies> <!--springcloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
3、yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*' #监控
启动类:@EnableDiscoveryClient(其实也可以不加,不过看着别扭就加了)
@SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } }
controller层:
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping("/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id){ return "nacos registry,serverPort: "+ serverPort+"\t id"+id; } }
测试(此时nacos注意要打开)
启动Nacos,启动9001
再访问:
到此nacos作为注册中心则整合完成,但为了后面其他组件的讲解这里再建一个提供者和一个消费者的模块
基于Nacos的服务消费者
1.新建module cloudalibaba-consumer-nacos-order83
2.pom.xml<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
Nacos自带负载均衡:
3.application.ymlserver: 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
4.主启动
@SpringBootApplication @EnableDiscoveryClient public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class,args); } }
5.业务类
//Nacos自带Ribbon,引入RestTemplate @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced //RestTemplate结合Ribbon做负载均衡一定要加@LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
@RestController public class OrderNacosController { /* 因为在yml中配置了service-url.nacos-user-service, 这里不需要再定义要访问微服务名常量,而是通过boot直接读出来 */ @Value("${service-url.nacos-user-service}") private String serverURL; @Resource private RestTemplate restTemplate; @GetMapping("/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id){ return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } }
6.启动83 ,测试
这里为了可以体现出ribbon的负载均衡效果,此时模仿cloudalibaba-provider-payment9001再建一个cloudalibaba-provider-payment9002,只是端口改下即可。然后将三个服务都启动起来(一个消费者,两个提供者)
多次刷新,9001、9002交替出现,这样消费者83访问服务提供者9001/9002,轮询负载OK
Nacos 支持AP 和 CP模式的转换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会受到响应。
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如SpringCloud和Dubbo服务,都适用与AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不出存在,则会返回错误。
用下面命令切换
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
三、nacos作为配置中心
在将实际配置前需要先理解一下几个概念:
图中每个instance(实例)相当于一个微服务,而每个微服务在nacos中的隔离是通过namespace+group+service来区分的。
namespace:命名空间,最大的一个隔离圈,默认有public(保留空间,不可删除),可以自己建立自己的命名空间,一般是以dev(开发)、prod(生产)、test(测试)为命名空间分别代表不同的生成环境(后面group用订单、支付、用户),以便来区分隔离不同环境的配置文件。也可以用不同的服务类型来区分:订单、支付、用户作为namespace来隔离(后面group用dev、prod、test)。一般推荐第一种即dev(开发)、prod(生产)、test(测试)为命名空间分别代表不同的环境(后面group用订单、支付、用户代表不同的服务)
group:namespece下的隔离级别,也是用来隔离配置文件的。一般namespace用dev/prod/test表示,而group则用不同的服务来隔离,例用户/支付/订单来表示不同服务的配置文件。
service:即用服务名来隔离(集群中同一个服务名可以有多个实例,但不同集群不能作为隔离条件,即你虽然配置是集群1,我仍然可以去集群2里找相同namespece+group+service的实例进行访问)
所以,整个配置中心实质就是靠着namespece+group+service进行配置的
(1)、配置命名空间:
依次建立dev、prod、test。
(2)建立配置文件:
此时我们现在dev的命名空间下建一个订单模块的配置文件:
这里要说明一下配置文件名(data ID)怎么命名:服务名-环境.文件类型 例如nacos-order-consumer-dev.yaml
(其中nacos-order-consumer是服务名),说明完则直接进行配置
此时我们新建一个模块去验证是否能拿到刚才配置的信息:
新建cloudalibaba-config-nacos-client3377模块
pom:
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
yml:这里用了bootstrap.yml和application.yml,前者的加载顺序比application快,不过最后的结果都是bootstrap.yml+application.yml的配置信息的总和。
#bootstrap.xml server: port: 3377 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 namespace: 1a9eb235-5053-45fb-a871-1a41306a60d5 #不指定找默认的命名空间(去nacos复制) group: order #分组,不配置找默认分组 # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file.extension} # 即nacos-order-consumer-dev.yaml
#application.yml spring: profiles: active: dev #开发环境
启动类:
@SpringBootApplication @EnableDiscoveryClient public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class,args); } }
controller:
@RestController @RefreshScope //SpringCloud原生注解 支持Nacos的动态刷新功能 public class ConfigClientController { @Value("${nacos.abc}") private String configInfo; @GetMapping("/nacos/abc") public String getConfigInfo(){ return configInfo; } }
测试成功:
当然你也可以自己去配置不同的namespace、group、sercive,只要注意以下几个点:
1、配置文件名编写规则
2、起到隔离的作用的只有namespace、group、sercive
3、集群配置不起到隔离作用
例如:
spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 namespace: 1a9eb235-5053-45fb-a871-1a41306a60d5 #不指定找默认的命名空间 group: order #分组 cluster-name: cluster1
不管你配哪个集群,只要其他集群有namespace+group+sercive相同的都会去访问。
四、最后讲下nacos的持久化(目前支持mysql)
Nacos默认自带的是嵌入式数据库derby,但如果重启nacos什么的,信息就会丢失,此时就需要将数据持久化到数据库中。
derby到mysql切换配置步骤:
- nacos-server-1.1.4\nacos\conf 目录下执行sql脚本
nacos-mysql.sql
- nacos-server-1.1.4\nacos\conf 目录下找到
application.properties
,添加配置:spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
重启nacos即可
在nacos中添加一些配置:
此时查看数据库
五、nacos集群设置
官网推荐集群模式:
vip则用nginx代替,有nginx负载均衡到各个nacos上,在配置nacos地址时直接写nginx地址即可。
这里的具体操作后面再写