网站首页 编程语言 正文
一、Nacos的概述
Nacos 是 Dynamic Naming and Configuration Service的首字母简称,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,是阿里巴巴的新开源项目 。
Nacos主要提供三种功能:服务注册与发现、动态配置服务、动态DNS服务。
二、Nacos的安装和启动
1.下载
Nacos下载地址:Tags · alibaba/nacos · GitHub
2.安装
将下载好的Nacos安装包上传到到linux服务上,使用xshell进行安装包上传。
[root@localhost ~]# rz #上传命令
[root@localhost ~]# mv nacos-server-1.4.1.tar.gz /usr/local #移动安装包
[root@localhost local]# tar -zxvf nacos-server-1.4.1.tar.gz #解压安装包
[root@localhost local]# rm -rf nacos-server-1.4.1.tar.gz #删除安装包
3.启动
[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
[root@localhost bin]# ./startup.sh -m standalone
/usr/local/jdk1.8.0_191/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/usr/local/jdk1.8.0_191/jre/lib/ext:/usr/local/jdk1.8.0_191/lib/ext -Xloggc:/usr/local/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /usr/local/nacos/logs/start.out
4.测试
浏览器访问:http://192.168.238.132:8848/nacos,默认用户名/密码为: nacos/nacos
注意:此网址为自己安装nacos虚拟机的ip地址;
如果Linux开启了防火墙的话需要把8848端口给放行,这样才能通过外网访问该端口。
//开放防火墙 systemctl start firewalld //关闭防火墙 systemctl stop firewalld //开放nacos端口 //命令含义: // --zone #作用域 // --add-port=8848/tcp #添加端口,格式为:端口/通讯协议 // --permanent #永久生效,没有此参数重启后失效 firewall-cmd --zone=public --add-port=8848/tcp --permanent # 重启防火墙 firewall-cmd --reload # 查看防火墙启动端口情况 firewall-cmd --list-all # 如果显示了该8848端口则为启动成功。
5.关闭
[root@localhost bin]# ./shutdown.sh
The nacosServer(8166) is running...
Send shutdown request to nacosServer(8166) OK
三、Nacos注册中心入门
1.什么是Nacos注册中心
注册中心主要有三部分组成:
Nacos-Server:注册中心
提供服务的注册和发现。
Nacos-Provider:服务提供方
把自身的服务实例注册到 Nacos Server 中
Nacos-Consumer:服务调用方
通过 Nacos Server 获取服务列表,消费服务。
2.代码案例
案例结构:
父工程pom.xml
<dependencies>
<!--Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
springcloud_common模块
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.wrs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud_common</artifactId>
</project>
pojo层
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
nacos_provider模块
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.wrs</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 9090
启动器
@SpringBootApplication
@EnableDiscoveryClient //向注册中心注册该服务,并可以获取其他服务的调用地址
public class NacosProviderApp {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApp.class);
}
}
service层
public interface UserService {
User getUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"张三",18);
}
}
controller控制层
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
nacos_consumer模块
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.wrs</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.238.132:8848 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的名字
启动器
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
config配置层
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
controller控制层
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient; //发现服务的工具类
@RequestMapping(value="/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//获取nacos中注册的所有服务信息
List<String> serviceList = discoveryClient.getServices();
for (String service : serviceList) {
System.out.println(service);
}
//获取nacos中注册的指定服务信息
ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
String serviceUrl = instance.getHost() + ":" + instance.getPort();
String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}
测试:
通过两个模块的启动,进行注册,注册到服务中心,如下图:
3. 为什么要使用注册中心?
因为不使用注册中心:1.地址硬编码
2.不能负载均衡
四、配置中心
1.配置中心入门
微服务架构下关于配置文件的一些问题:
-
配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
-
配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
-
配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题, 配置中心的思路是:
-
首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
-
当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
-
当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
nacos配置中心的作用:
系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。
创建nacos_config模块
添加依赖pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
bootstrap.yml
添加一个比application.yml文件优先级更高的配置文件 bootstrap.yml
bootstrap/application的应用场景:
- bootstrap.yml 比 application.yml 优先加载,应用于系统级别参数配置,一般不会变动;
- application.yml 应用于 SpringBoot 项目的自动化配置;
spring:
cloud:
nacos:
config:
server-addr: 192.168.238.132:8848 #配置中心得地址
file-extension: yaml #配置文件扩展名只支持properties和yaml
prefix: nacos-config #文件名,默认是spring.application.name
添加配置:
在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:
${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}
说明:
spring.cloud.nacos.config.prefix:默认是当前服务的服务名称
spring.cloud.nacos.config.file-extension:配置文件的格式(后缀),目前只支持yaml和properties
- 在nacos中创建配置文件
- Data ID:prefix.file-extension
- 配置格式:yaml或properties
controller控制器:
在配置内容中添加:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/health?characterEncoding=UTF-8
username: root
password: 1111
type: com.alibaba.druid.pool.DruidDataSource
可利用controller层进行读取,将所添加的内容显示到页面上
@RefreshScope 作用:在修改配置文件后则重新生成bean,能够实时更新配置内容
@RestController
@RefreshScope //修改配置文件后则重新生成bean
public class ConfigController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.type}")
private String type;
@GetMapping("/config/info")
public String getConfigInfo(){
System.out.println(this);
String configInfo=driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}
启动器
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class);
}
}
动态实时更新配置原理:
当启动时加载配置文件
修改配置文件后nacos监听到MD5有变化则推送消息给客户端(实际上就是调用客户端),客户端收到消息后会拉去最新配置
MD5相当于UUID,每次配置文件修改后,都会生成一个新版本,生成一个新的MD5,然后通知客户端,给客户端发送信息,客户端拉去更新后的配置信息
nacos会在本地缓存一份配置文件,当需要时能够直接从本地获取使用,如果配置文件有改动,则会从新获取一份,缓存到本地
一般会缓存到以下目录中
可以通过浏览器访问:http://127.0.0.1/config/info 查看配置信息
为什么要用配置中心:
因为配置中心可以:1. 集中管理配置文件
2.动态更新配置文件
2.配置中心隔离
1.配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
Namespace Group DataId介绍:
-
Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
-
Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
-
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
获取配置集需要指定:
1.nacos服务地址,必须指定
2.namespace,如不指定默认public
3.group,如不指定默认为DEFAULT_GROUP
namespace隔离
命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
新建namespace
建立好namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡,如下图:
克隆配置文件
点击左下角
“克隆”
按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。
选择中一个要克隆到的目标空间,也可以对克隆的配置文件进行Data ID,Group 名称修改,不修改则是默认被克隆的配置文件的Data ID,Group的名称,点击“开始克隆”,
点击克隆后,则是将被克隆的配置文件的内容全部克隆过来。
在bootstrap.yml中添加namesspace属性,例如:“namespace: dev”,依旧可以进行动态配置
spring: cloud: nacos: config: server-addr: 192.168.238.132:8848 #配置中心得地址 file-extension: yaml #配置文件扩展名只支持properties和yaml prefix: nacos-config #文件名,默认是spring.application.name namespace: dev #开发环境
Group隔离
1.新建配置文件并修改Group名
2.不同的配置分组下可以有相同的配置 ,相当于一个大文件夹(dev)有两个小文件夹(group)
bootstrap.yml
spring: cloud: nacos: config: server-addr: 192.168.238.132:8848 #配置中心得地址 file-extension: yaml #配置文件扩展名只支持properties和yaml prefix: nacos-config #文件名,默认是spring.application.name namespace: dev #开发环境 group: NACOS_GROUP #项目名
服务隔离
nacos_provider模块中application.yml
server: port: 9090 spring: cloud: nacos: discovery: server-addr: 192.168.238.132:8848 #nacos服务的地址 namespace: dev group: NACOS_GROUP application: name: nacos-provider #向注册中心注册的名字
在dev环境下能够看到nacos-provider,group为NACOS_GROUP
在public环境下能够看到nacos-consumer,group为DEFAULT_GROUP
进行调用时,找不到数据,前端报500错误,后端报“下标越界异常”说明了服务的隔离性 ,只有它们两个在同一环境下,才能正常的调用
五、Nacos集群和持久化
Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql
1.持久化
切换数据库
修改usr/local/nacos/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)
可以在linux图形化界面中,使用文本编译器打开
也可以使linux命令打开
[root@localhost bin]# cd /usr/local/nacos
[root@localhost nacos]# cd conf
[root@localhost conf]# vim application.properties
进到application.properties文件的编辑页面,找到下图中所圈的内容,将注释“#”删掉
并将第三个框中的内容进行修改,修改为自己的mysql数据库所在的ip地址,用户名和密码也要修改为自己的mysql数据库的用户和密码,如下图所示:
修改完成后,保存并退出,重启nacos;
初始化数据库
找到nacos-mysql.sql文件,将nacos-mysql.sql文件导入到数据库中;
新建配置文件:将Data ID、Group以及配置内容和配置格式填好并保持:
打开nacos数据库,查看config_info表,就能看到刚新创建的配置文件的数据了
2.集群
集群搭建
1.在usr/local/nacos中找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下:
这里ip地址之所以一样,是因为在同一台服务器linux上部署了三个nacos,是为了节省空间,真实的部署是分别部署在三台服务器上,ip地址各不相同;
# ip:port
192.168.238.132:8848
192.168.238.132:8849
192.168.238.132:8850
也可以通过linux命令找并修改:
[root@localhost ~]# cd /usr/local/nacos/conf
[root@localhost conf]# cp cluster.conf.example cluster.conf
[root@localhost conf]# vim cluster.conf
2.创建一个nacos_cluster文件夹,复制三份Nacos,并进行命名
[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir nacos_cluster
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8850
3.分别进到上边复制并重新命名的三个文件夹中将conf/appplication.properties中的端口号分别改为,因为有一个是端口是8845,是默认的,所以不用修改:
[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8849/conf/application.properties:
server.port=8849
[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8850/conf/application.properties:
server.port=8850
4.分别启动三个nacos
[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh
5.分别在浏览器上访问三个nacos
http://192.168.238.132:8848/nacos
http://192.168.238.132:8849/nacos
http://192.168.238.132:8850/nacos
6.启动一个服务,注册进去,进行测试,可以看到能够在三个nacos服务中显示出来,这里只截取一个图进行显示
7.随机选择一个nacos查看“节点列表”:
8.点开“节点元数据”,可以根据里面的内容判断哪个是“老大”;
老大的作用:是进行数据的同步,当老大死了,也就是挂了,就会推出来一个新的老大,是根据“投票机制”选出老大
配置代理服务
1.安装nginx的依赖库(c语言环境)
[root@localhost ~]# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.下载nginx
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
3.解压安装包
[root@localhost upload]# tar -zxvf nginx-1.12.0.tar.gz
4. 配置安装路径
[root@localhost upload]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
5.编译并安装
[root@localhost nginx-1.12.0]# make && make install
6.配置nginx代理nacos
首先找到nginx.conf文件,并打开进行修改
[root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
7.将图中圈中的地方替换为:
location / {
proxy_pass http://nacos;
}
8.在图中圈中的上方添加以下内容:
upstream nacos {
server 192.168.238.132:8848;
server 192.168.238.132:8849;
server 192.168.238.132:8850;
}
9.修改后为下图所示:
10.nginx的命令
[root@localhost conf]# cd ..
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ./nginx #启动
[root@localhost sbin]# ./nginx -s stop #关闭
[root@localhost sbin]# ./nginx -s reload #重启
11.启动nginx后,同时也要保持nacos集群的启动,这时启动一个服务进行测试
要启动的服务需要对application.yml进行改动,将端口号去掉
server:
port: 9090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.238.132 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的名字
在服务启动后,随机访问一个nacos:http://192.168.238.132/nacos/ 可以看到网址中的端口号已经没有了,测试结果如下:
六、Nacos开机启动
这里的开机启动是指:当打开安装的有nacos的linx系统时,nacos它会自动启动,不用人为启动,它启动的是单机启动,不是集群启动,主要是方便日常的使用。
1.添加nacos.service文件
[root@localhost ~]# vim /lib/systemd/system/nacos.service
2.在文件中添加以下内容:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3.修改nacos的starup.sh文件
[root@localhost ~]# vim /usr/local/nacos/bin/startup.sh
将下面内容直接复制到里面
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
4.设置开机自起
[root@localhost ~]# systemctl start nacos.service #启动nacos服务
[root@localhost ~]# systemctl daemon-reload #重新加载服务配置
[root@localhost ~]# systemctl enable nacos.service #设置为开机启动
如有错误请私聊或评论指正!!!
原文链接:https://blog.csdn.net/weixin_53390559/article/details/126323688
- 上一篇:没有了
- 下一篇:没有了
相关推荐
- 2022-11-07 python学习pymongo模块的使用方法_python
- 2023-07-10 Bean的生命周期和作用域
- 2022-11-10 一文详解Redis中的持久化_Redis
- 2022-09-09 OpenSSL生成v3证书方法及配置文件详解_其它综合
- 2022-05-06 Matplotlib安装与配置
- 2022-11-15 ASP.NET MVC遍历验证ModelState的错误信息_实用技巧
- 2022-05-20 浅谈redis的过期时间设置和过期删除机制_Redis
- 2022-05-11 Feign之间的文件传输
- 栏目分类
-
- 最近更新
-
- window11 系统安装 yarn
- 超详细win安装深度学习环境2025年最新版(
- Linux 中运行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存储小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基础操作-- 运算符,流程控制 Flo
- 1. Int 和Integer 的区别,Jav
- spring @retryable不生效的一种
- Spring Security之认证信息的处理
- Spring Security之认证过滤器
- Spring Security概述快速入门
- Spring Security之配置体系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置权
- redisson分布式锁中waittime的设
- maven:解决release错误:Artif
- restTemplate使用总结
- Spring Security之安全异常处理
- MybatisPlus优雅实现加密?
- Spring ioc容器与Bean的生命周期。
- 【探索SpringCloud】服务发现-Nac
- Spring Security之基于HttpR
- Redis 底层数据结构-简单动态字符串(SD
- arthas操作spring被代理目标对象命令
- Spring中的单例模式应用详解
- 聊聊消息队列,发送消息的4种方式
- bootspring第三方资源配置管理
- GIT同步修改后的远程分支