SpringCloud Alibaba Nacos服务注册和配置中心

感悟

注意:凡是cloud里面,你要开哪个组件,新加哪个注解,第一个就是启动,如@EnableFeignClients,第二个就是使用,如@FeignClient

模块对外暴露就需要建立端口,不对外暴露,那就不需要建立端口

注册中心相当于医院门诊挂号

如果只是一个病人一个医生,那当然不需要注册中心

问题是多个病人多个医生,就需要挂号了


注册中心在application. yml中

配置中心在bootstrap.properties中,因为配置中心是一开始引导就要启动的,bootstrap先启动

都是用的阿里的nacos

注册中心可以说是微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。

简单理解就是:在没有注册中心时候,服务间调用需要知道被当服务调方的具体地址(写死的ip:port)。更换部署地址,就不得不修改调用当中指定的地址。而有了注册中心之后,每个服务在调用别人的时候只需要知道服务名称(软编码)就好,地址都会通过注册中心根据服务名称获取到具体的服务地址进行调用。

需要配置中心来统一管理配置!把业务开发者从复杂以及繁琐的配置中解脱出来,只需专注于业务代码本身,从而能够显著提升开发以及运维效率。同时将配置和发布包解藕也进一步提升发布的成功率,并为运维的细力度管控、应急处理等提供强有力的支持。

Nacos简介

为什么叫Nacos

前四个字母为Nameing和Configuration的前两个字母,最后的s为Service

是什么

  • 一个更易于构建原生应用的动态服务发现、配置管理和服务管理平台
  • Nacos:Dynamic Naming and Configuration Service
  • Nacos就是注册中心+配置中心的组合

等价于:Nacos=Eureka+Config+Bus

能干嘛

  • 替代Eureka做服务注册中心
  • 替代Config做服务配置中心

去哪下

https://github.com/alibaba/Nacos

官网文档

各种注册中心对比

服务注册与发现框架 CAP模型 控制台管理 社区活跃度
Eureka AP 支持 低(2.x版本闭源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

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

安装并运行Nacos

  • 本地Java8+Maven环境已经ok
  • 先从官网下载Nacos
  • 解压安装包,直接运行bin目录下的startup.cmd
  • 命令运行成功后直接访问http://localhost:8848/nacos

默认用户名密码都是nacos

  • 结果页面

Nacos作为服务注册中心演示

官方文档

https://spring.io/projects/spring-cloud-alibaba

详细说明文档

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

基于Nacos的服务提供者

新建module

cloudalibaba-provider-payment9001

POM

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

本模块POM

<dependencies>
<!-- SpringCloud ailibaba 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.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>

YML

server:
port: 9001 spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址 management:
endpoints:
web:
exposure:
include: '*'

主启动

@SpringBootApplication
@EnableDiscoveryClient
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 "Hello Nacos Discovery: " + serverPort + "\t id: " + id;
}
}

测试

http://localhost:9001/payment/nacos/31

nacos控制台

nacos服务注册中心+服务提供者9001都ok了

为了下一章演示nacos集群,参考9001新建9002

这里如果名字取错了还暴力删除导致创建的工程没有source标志的,那是因为父工程的.idea文件没有更新,记得关掉项目删除.idea,再重新导入项目即可

cloudalibaba-provider-payment9002

取巧的方法是,直接拷贝虚拟端口映射(不建议,自己玩玩可以,因为还是同一个模块)

基于Nacos的服务消费者

新建Module

cloudalibaba-consumer-nacos-order83

POM

<dependencies>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.eiletxie.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.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>

为什么Nacos支持负载均衡



nacos内置了 ribbon

YML

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

主启动

@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 { public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}

业务类

ApplicationContextConfig

@Configuration
public class ApplicationContextConfig { @Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

OrderNacosController

@RestController
@Slf4j
public class OrderNacosController { @Resource
private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}")
private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id,String.class);
}
}

测试

http://localhost:83/consumer/payment/nacos/31

服务注册中心对比

Nacos全景图所示

Nacos和CAP



AP/CP切换

Nacos支持AP和CP模式的切换

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

何时选择使用何种模式?

一般来说,

如果不需要存储服务级别的信息且服务实例是通过nacos client注册,井能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和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作为服务配置中心演示

Nacos作为配置中心-基础配置

cloudalibaba-config-nacos-client3377

POM

<dependencies>
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.eiletxie.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.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>

YML

bootstrap

server:
port: 3377 spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置

application

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

why配置两个

Nacos同springcloud-config-样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 { public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}

业务类

ConfigClientController

@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class ConfigClientController { @Value("${config.info}")
private String configInfo; @GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}

@RefreshScope动态刷新,忘了吗?

在Nacos中添加配置信息

Nacos中的匹配规则

理论

Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则

官网

实操

配置新增



nacos-config-client-dev

Nacos界面配置对应

设置DataId

  • 公式:${spring.application.name}-${spring.profiles.active}.$
  • prefix默认为spring.application.name的值
  • spring.profile.active即为当前环境对应的profile,可以通过配置项spring.profile.active来配置。
  • file-exetension为配置内容的数据格式,可以通过配置项speing.cloud.nacos.config.file-extension配置
  • 小总结说明

历史配置
  • Nacos会记录配置文件的历史版本默认保留30天,此外还有一件回滚功能
  • 回滚

测试

  • 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
  • 运行cloud-config-nacos-client3377的主启动类
  • 调用接口查看配置信息

    http://localhost:3377/config/info

自带动态刷新

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新

Nacos作为配置中心-分类配置

问题

多环境多项目管理

问题1:

实际开发中,通常-个系统会准备

dev开发环境

test测试环境

prod生产环境。

如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:

一个大型分布式微服务系统会有很多微服务子项目,

每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境....

那怎么对这些微服务配置进行管理呢?

Nacos的图形化管理界面

配置管理

命名空间

Namespace+group+data ID三者关系?为什么这么设计?

  1. 是什么

    类似Java里面的package名和类名

    最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑 上区分两个目标对象。

  2. 三者情况

默认情况:

Namespace= public, Group=DEFAULT_ GROUP,默认Cluster是DEFAULT

Nacos默认的命名空间是public, Namespace主要用来实现隔离。

比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建E个Namespace, 不同的Namespace之间是隔离的。

Group默认是DEFAULT_ GROUP, Group可以把不同的微服务划分到同一个分组里面去

Service就是微服务; 一个Service可以包含多 个Cluster (集群),Nacos默认Cluster是DEFAULT, Clyster是对指定微服务的一个虚拟划分。

比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,

这时就可以给杭州机房的Service微服务起一个集群名称(HZ),

给广州机房的Service微服务起一个集群名称 (GZ) ,还可以尽量让词一个机房的微服务互相调用,以提升性能。

最后是Instance,就是微服务的实例。

Case

三种方案加载配置

DataID方案

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
默认空间+默认分组+新建dev和test两个DataID
新建dev配置DataID

新建test配置DataID

通过spring.profile.acvice属性就能进行多环境下配置文件的读取

测试

Group方案

通过Group实现环境区分

新建Group

在nacos图形界面控制台上新建配置文件DataID

bootstrap+application

在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP

Namespace方案

新建dev/test的Namespace

回到服务管理-服务列表查看

按照域名配置填写

YML

Nacos集群和持久化配置(重要)

官网说明

https://nacos.io/zh-cn/docs

官网架构图

上图翻译

说明

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认置下的Nacos节点,数据存储是存在一致性问题的。

为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。



按照上说,我们需要mysql数据库

官网说明

https://nacos.io/zh-cn/docs/deployment.html

重点说明

Nacos持久化配置解释

Nacos默认自带的是嵌入式数据库derby

derby到mysql切换配置步骤

nacos-server-1.1.4\nacos\conf目录下找到sql脚本

nacos-mysql.sql
执行脚本

这里说一下具体操作,你自己新建一个nacos_config的数据库,将对应的sql文件打开,复制命令执行即可

nacos-server-1.1.4\nacos\conf目录下找到application.properties

启动Nacos,可以看到是个全新的空记录界面,以前是记录进derby

Linux版Nacos+MySQL生产环境配置

预计需要,1个nginx+3个nacos注册中心,1个mysql

Nacos下载Liunx版

集群配置步骤

1.Linux服务器上mysql数据库配置

  • SQL脚本在哪里
  • sql语句源文件

    nacos-mysql.sql
  • 自己Linux机器上Mysql数据库粘贴

2.application.properties配置

位置

内容

3.Linux服务器上nacos的集群配置cluster.conf

梳理出3台nacos机器的不同服务端口号
复制出cluster.conf

内容



这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP

4.编辑Nacos的启动脚本startup.sh,使他能够接受不同的启动端口

/mynacos/nacos/bin 目录下有startup.sh
在什么地方,修改什么,怎么修改
思考

/mynacos/nacos/bin目录下有startup.sh

平时单机版的启动,都是./startup.sh即可。

但是

集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。

命令: ./startup.sh -p 3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。

修改内容





执行方式

5.Nginx的配置,由它作为负载均衡器

修改nginx的配置文件

nginx.conf



按照指定启动

6.截至到此为止,1个nginx+3个nacos注册中心+mysql

测试通过nginx访问nacos

http://192.168.111.144:1111/nacos/#/login

新建一个配置测试
linux服务器的mysql插入一条记录

测试

微服务springalibaba-provider-payment9002启动注册进nacos集群

yml

server:
port: 9002 spring:
application:
name: nacos - payment -provider
cloud:
nacos :
discovery:
#配置Nacos地址
#server-addr: localhost:8848
#换成nginx的1111端口,做集群
server-addr: 192. 168.111.144:1111 management:
endpoints:
web:
exposure:
include: *'
结果

高可用小总结

【SpringCloud】SpringCloud Alibaba Nacos服务注册和配置中心的更多相关文章

  1. SpringCloud Alibaba Nacos 服务注册

    业务服务接入Nacos服务治理中心 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/ 创建bom工程用于管理依赖(下方附加源码地址) 准备工作完成后开始接 ...

  2. Spring Cloud Alibaba | Nacos服务注册与发现

    目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...

  3. CoSky 高性能 服务注册/发现 & 配置中心

    CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...

  4. SpringCloud Alibaba Nacos服务注册与配置管理

    Nacos SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos:Dynamic Naming and Configurat ...

  5. Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

    Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能. 服务注册与发现功能解决了微服务集群中,调用者和服务提供者连 ...

  6. Spring cloud Alibaba Nacos服务注册发现和配置中心

    Nacos(官方网站:http://nacos.io)是一个易于使用的平台,旨在用于动态服务发现,配置和服务管理.它可以帮助您轻松构建云本机应用程序和微服务平台. Nacos = Eureka + c ...

  7. Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)

    文章目录 摘要 Nacos简介 使用Nacos作为注册中心 安装并运行Nacos 创建应用注册到Nacos 负载均衡功能 使用Nacos作为配置中心 创建nacos-config-client模块 在 ...

  8. SpringCloud用Zookeeper做服务注册与发现中心代码实现

    一:Zookeeper用的是3.5.5版本,SpringBoot用的是2.1.6版本,SpringCloud用的是Greenwich.SR2版本,JDK用的是1.8: 服务提供者product-ser ...

  9. SpringCloud源码学习笔记3——Nacos服务注册源码分析

    系列文章目录和关于我 一丶基本概念&Nacos架构 1.为什么需要注册中心 实现服务治理.服务动态扩容,以及调用时能有负载均衡的效果. 如果我们将服务提供方的ip地址配置在服务消费方的配置文件 ...

  10. 学习一下 SpringCloud (二)-- 服务注册中心 Eureka、Zookeeper、Consul、Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

随机推荐

  1. Xrm.Internal.openDialog打开对话框自定义页面

    在Dynamics CRM平台中使用自定义页面拓展功能实现有多种方式,比如嵌套iframe,比如直接打开一个新页面,再就是打开对话框了,对话框里为自定义页面. 调用方式很简单,先把自定义页面上传好后, ...

  2. React基础笔记1

    官网:https://react.docschina.org/ 一.认知React 概述 React 起源于 Facebook(脸书) 的内部项目,它是一个用于构建用户界面的 javascript 库 ...

  3. SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解

    一.什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...

  4. Java API 之 Object

    Object 顶级父类.任何一个类都将 Object 作为父类,也就意味着任何一个对象都可以赋值给 Object 对象.Object 类也是 Java 中唯一的一个没有父类的类. (方法默认是 pub ...

  5. JavaWeb的一些理解

    WEB概述 WEB是什么 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上的资源分类 Internet上供外界访问的Web资源分为: 静态 ...

  6. Golang-结构体6

    http://c.biancheng.net/golang/struct/ Go语言结构体定义 Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类 ...

  7. nginx配置参数优化

    ginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_proce ...

  8. linxu7下安装pacemaker+corosync集群-01

    1.yum仓库的配置-自行配置 2.安装软件包: yum -y install pacemaker* corosync* pcs* psmisc yum -y install pcs fence-ag ...

  9. ubuntu通过tar包安装mysql5.7.21

    作者:zuoguohui 一.场景:最近想搞mysql主从复制,需要在两台服务器上安装mysql,之前有一台已经装好了mysql5.7.21,于是在另外一台上也装mysql5.7.21,安装过程中碰到 ...

  10. Luogu P11553 ROIR 2016 Day 1 奇怪的字符串 题解 [ 绿 ] [ 后缀自动机 ] [ 枚举 ] [ 观察 ]

    奇怪的字符串:需要一点观察的 SAM 小清新题. 观察 我们首先观察什么样的字符串才是奇怪的,可以发现,首先类似 AAAAAAA 之类全部相等的字符串是奇怪的. 继续观察,如果字符种类变为两种或者三种 ...