Spring Cloud Alibaba官网:https://spring.io/projects/spring-cloud-alibaba
Spring Cloud Alibaba在github上的网址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
学习文档网址:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
1. 为什么叫Nacos?
前四个字母分别为Naming 和 Configuration 的前两个字母,最后的s为Service。——服务命名注册
2. 是什么?
官话:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
讲人话:Nacos就是 注册中心 + 配置中心 的组合。 等价于
Nacos = Eureka + Config +Bus
(它是一个用java语言开发的springboot项目)
3. 去哪下?
中文官网:https://nacos.io/zh-cn
各个版本下载:https://github.com/alibaba/nacos/tags
解压安装包,直接运行bin目录下的startup.cmd即可 (本次安装是windows下的安装比较简单)
命令运行成功后直接访问 http://localhost:8848/nacos
默认账号密码都是 nacos
登录后界面:
pom配置文件:
1)父项目配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
<dependencyManagement>
2)子项目pom配置
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>0.9.0.RELEASEversion>
dependency>
application配置:
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
主方法:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
测试服务的代码:
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;
@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的负载均衡,参照9001新建9002,这里不做演示
Nacos天生就可以负载均衡,因为它内部也集成了Ribbon,看下图:
这里我使用openFeign进行测试服务间的调用,因此依赖、注解需要额外配置openfeign的
pom配置文件:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>0.9.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
application配置文件:
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 注册到nacos服务的地址
主方法:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
OpenFeign服务接口代码:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Service
@FeignClient("NACOS-PAYMENT-PROVIDER")
public interface PaymentFeignService {
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id);
}
Controller层测试代码:
import com.coderzpw.springcloud.alibaba.service.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderNacosController {
@Autowired
private PaymentFeignService paymentFeignService;
@GetMapping("/order/paymentInfo/{id}")
public String paymentInfo (@PathVariable("id") Integer id){
return paymentFeignService.getPayment(id);
}
}
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级的,bootstrap优先与application
pom配置文件:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
<version>0.9.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>0.9.0.RELEASEversion>
dependency>
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: yml # 指定yml格式的配置
#group: SpringCloud_Alibaba # 指定分组, 可以不加group,则默认选择DEFAULT_GROUP组
#namespace: 2efe7528-33ef-49c4-bc8f-e52347c7cfd3 # 指定namespace, 可以不加namespace, 则默认选择public的命名空间
# Nacos上全局配置文件命名规则(Data Id): ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 前缀-开发环境类型(dev/test).文件类型(yml/properties) 例如:nacos-config-client-dev.yml
application配置:
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示开发环境
主方法:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
测试代码:
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;
@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class configController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/Info")
public String getConfigInfo (){
return configInfo;
}
}
在Nacos服务界面配置全局配置文件:
配置成功之后测试:
Nacos是可以动态刷新的(如果Nacos界面端修改了配置文件,咱们的项目不需要重新启动也可以获取更新的值,比spring config方便)
命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集。可以定义一个group为:STUDENT_GROUP。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即DataID。
在Nacos Spring Cloud中,项目匹配dataId的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项是spring.cloud.nacos.config.prefix
来配置spring.profile.active
即为当前环境对应的profile
。注意:当spring.profile.active
为空时,对应的连接符 - 也将不存在,dataId
的拼接格式变成${prefix}.${file-extension}
file-extension
为配置文件的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yml
类型最佳实践
Nacos抽象定义了Namespace、Group、Data ID的概念,具体这几个概念代表什么,取决于我们把它们看成什么,这里推荐给大家一种用法,如下图:
Namespace :代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
Nacos集群部署架构
http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式
官网架构图:
下面是一个相对容易理解的图:
默认Nacos使用嵌入式数据库(derby)实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储
derby到mysql切换配置步骤
1)在nacos-server-1.1.4\nacos\conf目录下找到nacos-mysql.sql脚本
2)执行脚本,执行之后的表(nacos_config数据库可以先自己创建再导入表)
3)修改\nacos\conf目录下的application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
在最后加入一下配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
4)重启Nacos服务
5) 重新创建配置文件
6)查看mysql里的数据
说明由Nacos内置数据库切换到外部数据库-mysql成功
预计需要,1个Nginx + 2个Nacos服务 + 1个Mysql
配置Nginx
这里我的Linux服务器上已经安装过了Nginx,我计划启动两个Nacos服务
localhost:8801 和 localhost:8802
上Nginx配置:
配置启动2个Nacos服务并指定数据源Mysql
计划:复制两份Nacos,一个端口号设为8801,另一个设为8802
1) 集群配置
进入nacos/conf目录
然后根据cluster.conf.example复制一个cluster.conf(很关键)
cp cluster.conf.example cluster.conf # 复制一份cluster.conf
修改cluster.conf配置文件
vim cluster.conf
2)指定mysql数据源配置
修改nacos/conf目录下的application.properties(Nacos主要的配置文件)
vim application.properties
在最后面加入配置(和在Windows上配置一样):
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
3)修改Nacos启动时默认消耗的JVM内存大小
因为Nacos在启动时默认会占用很大的JVM内存,如果我们启动两台或多台Nacos服务,可能最后只能启动成功一台o(╥﹏╥)o,因此我们需要修改一下默认启动消耗的JVM内存大小
修改nacos/bin目录下的启动命令文件——startup.sh(重要)
vim startup.sh
4)将nacos复制成两份
然后分别修改他们的端口号,端口号配置也在application.properties里
5)分别启动Nacos服务
集群启动命令是: ./startup.sh
(linux中)
单机启动的命令是: ./startup.sh -m standalone
启动时 可以查看动态日志:
tail -f ../logs/nacos.log # 查看动态日志
如果没有启动成功的话,里面会有详细报错信息,让你更加快速地定位错误原因,可以省去很多调试时间。
这里我们选择集群启动,分别对他们进行启动!!!
完成,撒花!!!!(〃‘▽’〃)(〃‘▽’〃)(〃‘▽’〃)