微服务架构 基础(八)
持续更新…
简单小结
到此为止,我们大致学习完了一遍Spring Cloud全家桶,总的技能点如下图示… 🌟🌟🌟🌟
但是为何又要选择Spring Cloud Alibaba?
由于上图Spring Cloud Netflix许多组件已经不再维护了,因此我们需要替代方案,而Spring Cloud Alibaba就是一个较为完美的解决方案…
技术迭代更新周期短,虽然感觉有点头秃的样子,吾生也有涯,而知也无涯…😑😑😣😣
Spring Cloud Alibaba简介
Spring Cloud Alibaba是依赖Spring Cloud 相关的标准实现的一套微服务的全家桶
Spring Cloud Alibaba整个大致架构图如下:
Spring Cloud Alibaba主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
Nacos服务注册和配置中心
什么是Nacos?
Nacos英文全称Dynamic Naming and Configuration Service,Na为Naming/NameServer即注册中心,Co为Configuration即注册中心,service是指该注册/配置中心都是以服务为核心。Nacos构建以"服务"为中心的现代应用架构的服务基础设施,致力于微服务的发现、管理和信息配置,能帮助开发者迅速实现动态服务发现、服务配置、服务元数据以及流量管理,从而更敏捷、更容易地构建、交付和管理微服务平台
通俗地说,Nacos = Eureka+Config+Bus(即Nacos等价于前面所学的Eureka/Config/Bus),并支持AP+CP
官网下载并安装Nacos
-
下载并解压,进入bin目录执行startup.cmd文件(此时默认是以集群方式打开,可能读者启动会报错,因此需要进入当前目录的cmd命令窗口,输入命令startup.cmd -m standalone以单机方式启动… )
-
启动之后输入网址http://192.168.56.1:8848/nacos/index.html,进入管理界面,默认的账号和密码都是nacos
Nacos服务注册中心
新建服务提供者子模块(nacos-servie-8001)
修改配置类:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 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-actuator</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- AlibabaCloud依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
添加application.yml文件:
server:
port: 8001
spring:
application:
name: nacos-service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有监控端点
新建主启动类:
package cn.wu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceApplication8001 {
public static void main(String[] args) {
SpringApplication.run(NacosServiceApplication8001.class,args);
}
}
新建控制层:
package cn.wu.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping("/provide")
public String provide(){
return "当前端口为: "+port+",你好,Nacos!";
}
}
启动该模块,进入Nacos管理界面查看详细信息:
Nacos负载均衡演示
由以下依赖可以了解到,Nacos自带了Ribbon,可以使用负载均衡…
通过参照nacos-service-8001添加服务提供者子模块(nacos-service-8001),记得需要修改端口号
此时,在同一个微服务名称下有两个实例对象:
新建服务消费者子模块(nacos-main-80)
依赖以及主启动类同以上两个子模块…
添加application.yml文件:
server:
port: 80
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 自定义服务提供者地址属性
nacos-provider-addr: http://nacos-service-provider
添加配置类:
package cn.wu.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;
@Configuration
public class ApplicationConfig {
@Bean("restTemplateBean")
@LoadBalanced // 负载均衡注解
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
添加控制层类:
package cn.wu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
// 配置与代码做到分离
@Value("${nacos-provider-addr}")
private String serverURL ;
private RestTemplate restTemplate;
@Autowired
@Qualifier("restTemplateBean")
public void setRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/test")
public String tet(){
return restTemplate.getForObject(serverURL+"/provider",String.class);
}
}
首先启动两个服务提供者,然后再启动服务消费者
实现了默认的轮询负载均衡效果:
负载均衡权重策略
服务消费者application.yml文件添加如下配置信息:
# 用于实现服提供者的负载均衡
user-service: # 微服务的名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
可视化界面中配置权重:
访问效果为多次命中权重较高的服务提供者端口…
实例对象状态
设置为非临时实例
临时实例采用心跳模式,非临时实例采用非主动检测模式,临时实例心跳不正常会被剔除,非临时实例则不会被剔除
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos服务配置中心
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式将编程${prefix}.${file-extension}。
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
新建服务配置中心子模块(nacos-config-center-10002)
引入主要依赖:
<!--配置中心依赖 -->
<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>
主启动类不要忘记带@EnableDiscoveryClient注解了…
添加一个application.yml文件和一个bootstrap.yml文件,内容分别为:
spring:
profiles:
active: dev # 开发环境
server:
port: 10002
spring:
application:
name: nacos-config-center
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos作为注册中心
config:
server-addr: localhost:8848 # Nacos作为配置中心
file-extension: yaml # 指定为yml格式配置文件
# 此时的dataId应该为nacos-config-center-dev.yaml完整拼写规则
添加控制层:
package cn.wu.controlle;
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;
@RefreshScope // 热更新注解
@RestController
public class ConfigController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return "当前的还配置信息为: "+configInfo;
}
}
按照以上的写法,dataID的完整拼写就是:nacos-config-center-dev.yaml格式
然后我们通过Nacos管理界面添加配置文件
新建配置文件中,输入Data Id以及填写文件内容
这里读者可能要小心文件名称和yaml文件内容的缩进问题…
访问结果为:
此时,再次修改Nacos管理界面中的yaml文件内容,重新输入URL,可以发现动态刷新的效果:
多环境配置共享
建立${spring.application.name}.yaml文件即可
多种配置的优先级
服务名称-profile.yaml > 服务名称.yaml > 本地配置
Nacos图形化管理界面
默认情况下,Namespace=public,Group=DEFAULT_GROUP,默认Cluster为DEFAULT,三者的范围大小大致如下:
- Nacos默认的命名空间是public,Namespace主要是用来作为隔离。比如对于不同的环境:开发、测试、生产环境,就可以创建三个不同的Namespace,对于不同的Namespace是相互隔离的。
- Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组中去。
- Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分,通过集群可以提高微服务的容灾性能。
- Instance就是微服务实例对象。
项目推荐用法为:一个微服务一个命名空间,各个微服务中使用分组来区分环境,比如开发,测试,生产
测试DateId方案,默认的的Namespace和Group下,通过Data Id划分不同环境
可视化管理界面中新建nacos-config-center-test.yaml文件,内容如下:
config:
info: 测试环境,世界,你好!
然后修改application.yml文件内容为:
spring:
profiles:
active: test # 测试环境
# active: dev # 开发环境
此时,重启后访问相应的URL,结果为:
测试Group方案,默认Namespace相同,DataId相同
分别在不同的group(INFO_GROUP_1和INFO_GROUP_2)新建两个nacos-config-center-info.yaml文件:
修改application.yml和bootstrap.yml文件内容:
spring:
profiles:
active: info
# active: test # 测试环境
# active: dev # 开发环境
...
server:
port: 10002
spring:
application:
name: nacos-config-center
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos作为注册中心
config:
server-addr: localhost:8848 # Nacos作为配置中心
file-extension: yaml # 指定为yml格式配置文件
group: INFO_GROUP_1 # 指定分组为INFO_GROUP_1的分组
重新启动,浏览器中输入URL,测试:
修改bootstrap.yml文件内容的group为INFO_GROUP_2,重启,此时的结果为:
测试Namespace方案,默认Group,相同的DataId
新建两个命名空间(dev和test):
在dev的命名空间创建三个yaml文件(同理,在test中也创建三个yaml文件):
分别修改application.yml和bootstrap.yml文件内容为:
spring:
profiles:
# active: info
# active: test # 测试环境
active: dev # 开发环境
...
server:
port: 10002
spring:
application:
name: nacos-config-center
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos作为注册中心
config:
server-addr: localhost:8848 # Nacos作为配置中心
file-extension: yaml # 指定为yml格式配置文件
group: DEFAULT_GROUP # 指定分组为DEAULT_GROUP的分组
namespace: 5aaa10f2-9fdc-40c7-9617-6736a6bd5eba # 命名空间ID
其余相应测试读者自行尝试…
Nacos集群和持久化配置
默认Nacos使用嵌入式数据实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群持久化部署,目前只支持MySQL。
Nacos支持三种部署模式
- 单机模式 - 用于测试和单机试用
- 集群模式 - 用于生产模式,确保高可用
- 多集群模式 - 用于多数据中心场景
首先进入Nacos解压目录寻找conf目录下找到nacos-mysql.sql文件,新建数据库全名为nacos_config的数据库,再使用MySQL执行该SQL脚本文件…
然后,在当前目录下修改application.properties文件,增加mysql数据源…
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.50.248:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
修改完毕后,保存重启Nacos
进入管理界面,添加一个配置文件,并查看数据库信息:
持久化完成…
总而言之,只要包含了bootstrap.yml文件,不管是数据源配置还是框架配置等,都可以通过nacos来实现动态配置…
Linux版Nacos与MySQL生产环境配置
环境搭建要求: 一个Nginx,三个注册中心Nacos节点以及一个MySQL
Ubuntu下载Nacos集群
下载相应Nacos的tar.zip包并解压,然后复制三份Nacos(分别命名为为nacos-1,nacos-2,nacos-3),然后进入nacos-1/conf目录下修改application.properties(有两处地方需要修改… )
MySQL创建nacos_config数据库,并执行nacos-mysql.sql脚本文件,然后修改启动Nacos内存大小限制,防止出现内存不足的情况
在当前目录复制一份cluster.conf,修改内容(这里要注意将主机名要填写ip地址… )
其余Nacos文件同样操作,分别修改port为4444和5555…
Docker实现Nacos集群(推荐…)
nacos1
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=3333 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 3333:3333 \
--name nacos1 \
nacos/nacos-server:1.3.0
nacos2
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=4444 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 4444:4444 \
--name nacos2 \
-d nacos/nacos-server:1.3.0
nacos3
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=5555 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 5555:5555 \
--name nacos3 \
nacos/nacos-server:1.3.0
如下:
Ubuntu中配置Nginx
在/etc/nginx/nginx.conf修改配置
重启Nginx后,访问http://localhost:1111/nacos/index.html,结果为:
以上实现了服务器端的负载均衡…
Nacos管理界面添加配置文件(nacos-config-center-dev.yaml),然后回到IDEA,修改服务配置中心子模块(nacos-config-center-10002)的配置文件
spring:
profiles:
# active: info
# active: test # 测试环境
active: dev # 开发环境
####################################################################
server:
port: 10002
spring:
application:
name: nacos-config-center
cloud:
nacos:
discovery:
server-addr: 192.168.50.248:1111 # Nacos作为注册中心,由于利用到了负载均衡,所以这里填写Nginx监听端口
config:
server-addr: 192.168.50.248:1111 # Nacos作为配置中心,由于利用到了负载均衡,所以这里填写Nginx监听端口
file-extension: yaml # 指定为yml格式配置文件
# group: INFO_GROUP_1 # 指定分组为INFO_GROUP的分组
# namespace: 5aaa10f2-9fdc-40c7-9617-6736a6bd5eba # 命名空间ID
测试结果为:
内容扩充
Ubuntu中JDK安装
- 首先下载tar包,通过tar -zxvf命令解压
- 移动,sudo mv jdk /usr/local/jdk8
- 环境配置,cd /root , sudo vim .bashrc