Spring Cloud Alibaba Nacos

1. Spring Cloud Alibaba简介

SpringCloud Netflix进入维护模式,意味着不再开发新的组件,这就出现了SpringCloud Alibaba这个替代品,SpringCloud Alibaba能实现以下功能

使用SpringCloud Alibaba需要在POM文件中引入其依赖:

<dependencyManagement><dependencies><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></dependencies>
</dependencyManagement>

2. Nacos作为服务注册中心

1. Nacos简介

“Nacos”,前四个字母分别问Naming和Configuration的前两个字母,最后的s为Service,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,说白了就是注册中心+配置中心的组合,等价于SpringCloud之前的Eureka+Config+Bus,所以Nacos可以替代Eureka做服务中心,可以替代Config做配置中心。

2. Nacos安装与运行

在Nacos官网下载地址中下载Nacos,在安装Nacos前需要本地Java8和Maven的环境已经准备好,然后下载其压缩包:

解压该压缩文件后直接运行在bin目录下的startup.cmd启动Nacos:

然后访问 http://localhost:8848/nacos/ 进入Nacos,其默认的账号密码都是nacos,登录成功后即可看到如下界面:

在之前学习服务注册中心的时候讲过CAP理论,即

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性、可用性、分区容错性。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。在分布式架构中,P永远要求被保证,所以当前的分布式架构只有AP和CP两种。Nacos属于AP模型,再次对比这些服务注册中心:

据说Nacos在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验。。。

3. Nacos作为服务注册中心

1. 基于Nacos的服务提供者

新建Module:cloudalibaba-provider-payment9002作为服务提供方微服务。当然为了实现Nacos的负载均衡,使nacos-payment-provider服务集群化,我们同事也仿照9002搭建一个9003微服务。

然后在工程的父POM中引入依赖1. Spring Cloud Alibaba简介中引入的依赖的前提下,在该模块的POM引入依赖Nacos服务注册发现的依赖:

<!--SpringCloud ailibaba nacos -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

然后添加其配置文件application.yml:

server:port: 9002spring:application:name: nacos-payment-provider # 微服务名称cloud:nacos:discovery:server-addr: localhost:8848 # 配置Nacos地址management:endpoints:web:exposure:include: '*' # 监控端点全部打开

编写其主启动类并在主启动类上添加@EnableDiscoveryClient注解,使9002微服务能够被注册中心发现:

package cn.sher6j.springcloudalibaba;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @author sher6j* @create 2020-05-26-9:56*/
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9002 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class);}
}

然后编写一个简单的业务类:

@RestController
public class PaymentController {@Value("${server.port}")private String serverPort;@GetMapping("/payment/nacos/{id}")public String getPayment(@PathVariable("id") Integer id) {return "Nacos服务注册,端口:" + serverPort + ";id:" + id;}
}

启动9002、9003微服务模块,在Nacos的服务列表中我们可以看到这两个微服务已经入驻服务注册中心:

点开nacos-payment-provider服务的详情页面,可以看到服务的实例详情:

2. 基于Nacos的服务消费者

新建Module:cloudalibaba-consumer-nacos-order83作为服务消费方微服务,在该模块的POM中同样引入令Nacos服务注册中心发现自己的依赖,配置其配置文件:

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

然后编写服务消费方的主启动类,Nacos本身就具有负载均衡功能,因为引入Nacos依赖的同时,Nacos内部集成了Ribbon

而我们在学习Ribbon时知道,用了Ribbon就需要使用RestTemplate,所有我们编写配置类,向Spring容器中注入RestTemplate

package cn.sher6j.springcloudalibaba.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @author sher6j* @create 2020-05-26-10:40*/
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalanced //负载均衡public RestTemplate getRestTemplate() {return new RestTemplate();}
}

注意注入 RestTemplate 时一定要添加 @LoadBalanced 注解,否则不会开启负载均衡,在服务提供方集群的情况下,由于没有开启负载均衡,消费方会无法选择具体调用哪个微服务实例,也就是服务提供方实例有很多个,而消费方服务不知道要调用哪个具体的服务提供方实例,不加该注解会产生 UnknownHostException 的异常:

然后编写其业务类:

package cn.sher6j.springcloudalibaba.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;/*** @author sher6j* @create 2020-05-26-10:42*/
@RestController
@Slf4j
public class OrderNacosController {@Autowiredprivate 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);}
}

启动83服务消费方,在Nacos服务注册中心中我们可以看到入驻了两个服务提供方实例和一个服务消费方实例:

3. 测试

多次访问 http://localhost:83/consumer/payment/nacos/1 (id值随意,紧作为测试用1代替),我们发现服务消费方微服务83可以完成对服务提供方微服务9002/9003的轮询负载均衡调用,也就是Nacos内部就整合了Ribbon,实现了负载均衡,默认负载均衡算法采用轮询:

3. 各种服务注册中心的对比

事实上,Nacos可以AP模式和CP模式中进行切换,也就是说Nacos不仅仅支持AP(可用性和分区容错性),它同样支持CP(一致性和分区容错性)。当采取入驻到Nacos服务注册中心的微服务对自己的健康状态进行上报时,也就是对入驻到注册中心的微服务进行非持久化的保存,一旦客户端上报不健康信息,就将不健康的实例摘除掉,这类似于Eureka(当然Eureka可以开启自我保护模式);当采取由Nacos服务注册中心自己探测入驻到中心的微服务是否健康时,也就是对入驻到注册中心的微服务进行持久化保存,即使服务注册中心发现微服务已经不健康了,也不会删除到微服务,这类似于Consul。如下图(CoreDNS也是一种服务注册中心):

Nacos与其他服务注册中心特性的对比:

从理论知识中我们知道Nacos服务注册中心可以在AP和CP模式中进行切换,C是所有节点在同一时间看到的数据是一致的,而A是所有的请求都会受到响应(A可以近似理解为高可用)。

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

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

如果需要让Nacos服务从AP模式切换到CP模式的话,只需要向服务注册中心发送POST请求即可:

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

4. Nacos作为服务配置中心

在用SpringCloud Config结合SpringCloud Bus时,我们可以把配置信息托管到远端如GitHub上,而现在我们应用了Nacos后,可以直接在Nacos上托管配置信息。

1. Nacos作为配置中心——基础配置

新建Module:cloudalibaba-config-nacos-client3377作为服务配置中心微服务,在其POM文件中引入必要的依赖(如Nacos服务注册中心的依赖)为,引入配置中心的依赖:

<!--nacos-config-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

Nacos同SpringCloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动,而我们知道SpringBoot配置文件的加载顺序是存在优先级的,bootstrap的优先级要高于application,所以我们创建两个配置文件 bootstrap.yml (从配置中心拉取配置)和 application.yml(写自己的配置),我们配置 bootstrap.yml 以使3377服务从Nacos上拉取配置信息:

# nacos配置
server:port: 3377spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml # 指定yaml格式的配置,也就是说从Nacos上读yaml格式的配置文件

然后用application.yml定制自己的配置信息,将环境定义为开发环境:

spring:profiles:active: dev # 表示开发环境

编写其主启动类后,然后编写其业务类,在业务来上添加SpringCloud的原生注解**@RefreshScope以使服务可以支持从Nacos配置中心动态刷新配置信息**,

package cn.sher6j.springcloudalibaba.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author sher6j* @create 2020-05-28-21:07*/
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {@Value("{config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}

在上面的业务层中我们从配置中心读取了配置信息

而我们在Nacos配置中心中添加配置信息,在Nacos配置中心中添加配置文件要遵循一定的匹配规则——Nacos中的 dataId 的组成格式及与SpringBoot配置文件中的匹配规则,更详细的信息可以参考Nacos官方文档,在Nacos SpringCloud中,dataId的完整格式为:

${prefix}-${spring.profile.active}.${file-extension}

prefix 默认为 Web Server's Default Page (服务名)的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

spring.profile.active 即为当前环境对应的 profile(上面我们在 application.yml中配置的属性),详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}, 建议不要使spring.profile.active 为空。

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

由于prefix 默认为 Web Server's Default Page (服务名)的值,所以 dataId 的完整格式可以替换为:

${spring.application.name}-${spring.profile.active}.${file-extension}

结合我们在boostrap.yml配置文件和application.yml配置文件的配置,我们可以得到在当前实例中的dataId应该为:

nacos-config-client-dev.yaml

根据上述公式得到dataId应为的值后,我们就可以在Nacos配置中心的配置列表中新建配置文件:

在新建配置文件时,Data ID中填入我们得到的dataId,组名先选择默认的即可,配置格式选择我们在file-extension中设置的YAML格式,然后编写配置文件,编写后点击发布即可:

spring cloud alibaba_Spring-Cloud-Alibaba相关推荐

  1. Spring MVC Boot Cloud 技术教程汇总

    转载自 Spring MVC & Boot & Cloud 技术教程汇总 昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技 ...

  2. spring boot 和cloud 版本升级

    spring boot 和cloud 版本对应 背景:原来一直用的版本是Hoxton.SR12 +2.3.10.RELEASE(SR12一路升,几乎没有影响,不需要测试,但是换大版本就有点担心) 去年 ...

  3. RSE2021/云检测:Automatic cloud and cloud shadow detection in tropical areas用于PlanetScope热带地区自动云和云阴影检测

    RSE2021/云检测:Automatic cloud and cloud shadow detection in tropical areas for PlanetScope satellite i ...

  4. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  5. 【Spring Cloud】03_SpringCloud Alibaba 微服务解决方案

    微服务简介 背景分析 讲微服务之前,我们先分析以下单体应用.所谓单体应用一般是基于idea/eclipse,maven等建一个工程,然后基于SpringBoot,spring,mybatis框架进行整 ...

  6. Spring Cloud-鸿鹄Cloud分布式微服务云系统—架构图

    这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好 ...

  7. Spring MVC Boot Cloud 技术教程汇总(长期更新)

    昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...

  8. spring cloud bus_Spring Cloud学习笔记--消息总线(Bus)

    Spring Cloud Bus links nodes of a distributed system with a lightweight message broker. This can the ...

  9. Spring Cloud--鸿鹄Cloud分布式微服务云系统—云架构代码结构构建(五)

    根据微服务化设计思想,结合spring cloud一些优秀的项目,如服务发现.治理.配置化管理.路由负载.安全控制等优秀解决方案,使用Maven技术将框架进行模块化.服务化.原子化封装并构建,也为后期 ...

  10. Spring:从零开始的Cloud生活(一)——Eureka 深入理解

    目录 1.基本架构 1.1 Eureka三个核心要素 1.2 服务治理机制 1.2.1 服务提供者 1.2.2 服务消费者 1.2.3 服务注册中心 2.源码分析 2.1 Region.Zone 2. ...

最新文章

  1. python【数据结构与算法】关于树和二叉树的探索与计算
  2. (补充)爬取大西洋月刊并调用彩云小译翻译 API 脚本
  3. 常用正则表达式总结(js与C#对照) 。
  4. flutter开发vscode插件推荐(开发必备)
  5. MySQL 索引的面试题总结
  6. 【白皮书分享】2022年私域运营趋势及创业机会.pdf(附下载链接)
  7. Redhat/CentOS修改主机名
  8. android将activity打成jar包供第三方调用,把Activity打包成jar供其App使用
  9. JDK JRE JVM的区别
  10. 小软件Gnutella掀起因特网大风暴
  11. 断言(assert)方法
  12. 重拾java基础知识总结(超级经典)
  13. linux桌面小程序开发日记3(pyqt5+yolov5)
  14. 成都榆熙:拼多多店铺装修的作用是什么?
  15. 在R语言中实现Logistic逻辑回归
  16. 微服务配合docker使用
  17. java 计时 timeclock_计时器的time_t和clock_t 的两种实现方法(推荐)
  18. QQ头像的延时提示框
  19. 兴业银行银企直联如何判断支付结果是否成功
  20. 动手学深度学习之目标检测基础

热门文章

  1. 投资的境界:及时抓住机会或止损才是硬道理
  2. C 标准库 - ctype.h
  3. Effective C++:条款33:避免遮掩继承而来的名称
  4. eclipse 环境下 FreeMarker 编辑器插件
  5. onSaveInstanceState与onRestoreInstance
  6. hadoop完全分布式
  7. Oracle笔记 四、增删改、事务
  8. Leangoo研发管理软件甘特图6.0.2 版发布
  9. Kafka万亿级消息实战
  10. 我用分布式事务干掉了一摞简历