700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SpringCloud Alibaba实战--第二篇:NacosⅠ服务注册和配置中心

SpringCloud Alibaba实战--第二篇:NacosⅠ服务注册和配置中心

时间:2024-04-16 00:36:00

相关推荐

SpringCloud Alibaba实战--第二篇:NacosⅠ服务注册和配置中心

系列文章目录

微服务新王SpringCloudAlibaba


文章目录

系列文章目录前言一、Nacos是什么?能干啥?二、Nacos下载及安装1. 下载2. 安装并运行3. 对比Eureka 三、Nacos作为服务注册中心的演示1. 先构建好基础工程(一篇一篇看过来的不用重新构建)话不多说,立马开干2. 创建基于Nacos的服务提供者3. 启动测试4. 创建一个9002模块(方便后面负载均衡测试)5. 创建基于Nacos的服务调用者模块6. 编写服务调用业务类7. 启动测试调用 四、Nacos作为服务注册中心的对比1. Eureka、Zookeeper、Consul的对比之前SpringCloud注册中心几篇提到的CAP介绍 2. Nacos:我都要 总结

前言

如果说有一个SpringCloudAlibaba有一个组件能够封神的话,那么毫无悬念,他就是Nacos!前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。服务的命名,配置管理。Nacos是SpringCloudAlibaba的核心组件。

一、Nacos是什么?能干啥?

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心 + 配置中心的组合。Nacos = Eureka+Config +Bus。替代Eureka做服务注册中心。替代Config做服务配置中心。据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验。

二、Nacos下载及安装

首先本地要有Java8+Maven环境。

1. 下载

进入Nacos官网

https://nacos.io/zh-cn/index.html

点击windows下的zip包,进行下载。

2. 安装并运行

解压安装包,使用CMD小黑窗口直接运行bin目录下的startup.cmd

启动成功之后访问页面查看Nacos,端口号是8848,默认账号密码都是nacos

http://localhost:8848/nacos

3. 对比Eureka

首先,Nacos和Ehreka做注册中心功能点是类似的,也都提供有web页面。其次,Eureka做注册中心需要我们自己搭建模块,而Nacos则直接封装好的,因此选择Nacos会更方便一点。Nacos是中文的,多数数据都是表格的方式呈现的,对我们来说更加友好。

三、Nacos作为服务注册中心的演示

我们测试下Nacos作为服务注册中心,然后我们将服务注册进Nacos。

官方文档(我们的配置都是根据官方文档来的):

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_config

1. 先构建好基础工程(一篇一篇看过来的不用重新构建)

构建基础父工程

Rest风格微服务

传统分布式方法

改造工程,抽取公共模块

想偷懒的请下载;gitee上我上传的代码

基础工程构建完成的目录结构:

启动所有模块,访问

localhost:7001

显示如下,代表基础工程没问题

话不多说,立马开干

2. 创建基于Nacos的服务提供者

模块名

cloudalibaba-provider-payment9001

在父工程的POM中引入依赖(我们已经添加过)

<!--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>

新建的9001模块的pom,主要是spring-cloud-starter-alibaba-nacos-discovery

<dependencies><!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringBoot整合Web组件 --><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><!--日常通用jar包配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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>

application.yml

server:port: 9001spring:application:name: nacos-payment-provider # 注册进注册中心的服务名cloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'

主启动类

com.atguigu.springcloud.PaymentMain9001

package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @Author: Daisen.Z* @Date: /1/13 14:31* @Version: 1.0* @Description:*/@SpringBootApplication@EnableDiscoveryClientpublic class PaymentMain9001 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class,args);}}

编写一个测试接口

package com.atguigu.springcloud.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;/*** @auther zzyy* @create -02-23 14:13*/@RestControllerpublic 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;}}

3. 启动测试

启动nacos注册中心,启动新建的9001模块,访问nacos页面

http://localhost:8848/nacos

访问9001接口测试

http://localhost:9001/payment/nacos/1

4. 创建一个9002模块(方便后面负载均衡测试)

真实开发部署时我们9001和9002是一个集群,除了端口不一样其他的都一样,大家可以参照9001创建出一个9002工程,把端口修改下即可。

这里为了方便测试也为了方便大家学习,我演示一种取巧的方法,这里不得不说一句,IDEA牛逼!

大致的操作就是将9001工程虚copy一份(虚拟的复制一份工程),除了端口不同其他的实际上都还是会找9001。

调出Run Dashboard

不会的请移步:https://xiaozhang./article/details/121999966?spm=1001..3001.5502

查看使用Run Dashbord右键9001服务,点击Copy Configxxxx

-DServer.port=9002

已经有了

我们把这个9001和9002都启动起来,在查看nacos,会发现已经有两个实例了

查看详情

在访问下9002的接口

http://localhost:9002/payment/nacos/1

OK,没问题了

5. 创建基于Nacos的服务调用者模块

模块名

cloudalibaba-consumer-nacos-order83

pom依赖

<dependencies><!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><!-- SpringBoot整合Web组件 --><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><!--日常通用jar包配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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>

application.yml

server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)service-url:nacos-user-service: http://nacos-payment-provider

包名

com.atguigu.springcloud.alibaba

启动类OrderNacosMain83

package com.atguigu.springcloud.alibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @auther zzyy* @create -02-23 14:44*/@EnableDiscoveryClient@SpringBootApplicationpublic class OrderNacosMain83{public static void main(String[] args){SpringApplication.run(OrderNacosMain83.class,args);}}

配置RestTemplate

package com.atguigu.springcloud.alibaba.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;/*** @auther zzyy* @create -02-23 14:45*/@Configurationpublic class ApplicationContextConfig{@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}}

6. 编写服务调用业务类

package com.atguigu.springcloud.alibaba.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;/*** @auther zzyy* @create -02-23 15:01*/@RestController@Slf4jpublic class OrderNacosController{@Resourceprivate RestTemplate restTemplate;// 从配置文件读取微服务调用地址@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping(value = "/consumer/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id){return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);}}

7. 启动测试调用

启动nacos、9001、9002及83模块,查看服务nacos控制台

http://localhost:8848/nacos

三个服务都已经注册上来

测试通过83服务调用9001/9002微服务及负载均衡,多刷新几次,发现serverport会在9001和9002之间来回变,这就说明已经支持了负载均衡

http://localhost:83/payment/nacos/1

四、Nacos作为服务注册中心的对比

1. Eureka、Zookeeper、Consul的对比

之前SpringCloud注册中心几篇提到的CAP介绍

C: Consistency(强一致性)

A: Availability(可用性)

P: Partition tolerance(分区容错性)

CAP理论关注粒度是数据,而不是整体系统设计的策略

AP(Eureka):AP架构当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。结论:违背了一致性C的要求,只满足可用性和分区容错,即AP(保障健康的服务,允许心跳停止的服务继续存在)。

CP(Zookeeper/Consul):CP架构当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性结论:违背了可用性A的要求,只满足一致性和分区容错,即CP (保障服务一致,发现心跳停止的服务立即干掉)。

2. Nacos:我都要

C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。

何时选择使用何种模式?

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

nacos支持CP和AP模式的切换,想要什么姿势都可以!!!

使用POST请求,以下方式即可完成AP和CP模式的切换。

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'


总结

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心 + 配置中心的组合。Nacos = Eureka+Config +Bus。替代Eureka做服务注册中心。替代Config做服务配置中心。据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验。Nacos做服务注册中心天然支持Ribbon负载均衡。Nacos提供了接口支持AP模式和CP模式的切换。Nacos挺牛逼。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。