一、Nacos安装和启动
1、下载
下载地址:Tags · alibaba/nacos · GitHub
2、安装
linux操作:
2.1、把安装包先上传到 /usr/upload 目录下 进入该目录
2.2 、解压并移动到 /usr/local目录下
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local //解压并移动
3、启动和关闭
启动: 进入cd /usr/local/nacos/bin
执行./startup.sh -m standalone #非集群模式启动
... ... nacos is starting with standalone #出现这个表示启动成功!!!
nacos is starting,you can check the /usr/java/nacos/logs/start.out
关闭: 在 /usr/local/nacos/bin 下执行 ./shutdown.sh
[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK #关闭成功
[root@localhost bin]
4、测试
浏览器访问:http://192.168.128.131:8848/nacos
默认用户名/密码为: nacos/nacos
注意: 192.168.128.131这个是你启动的nacos的主机ip、
8848是nacos默认的端口
成功页面
*************************************************************************************
二、nacos注册中心(存放服务)
1、什么是Nacos注册中心?
概念:
注册中心主要有三部分组成:
Nacos-Server:注册中心
提供服务的注册和发现。
Nacos-Provider:服务提供方
把自身的服务实例注册到 Nacos Server 中
Nacos-Consumer:服务调用方
通过 Nacos Server 获取服务列表,消费服务
项目结构:
父项目springCloud_parent pom文件配置
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.peng</groupId>
<artifactId>springCloud_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud_commom</module>
<module>nacos_provider</module>
<module>nacos_consumer</module>
<module>nacos_config</module>
</modules>
<properties>
<!-- 项目源码及编译输出的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 项目编译JDK版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<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>
</dependencyManagement>
</project>
操作:
第一步:添加依赖 Nacos-Provider:服务提供方
<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>com.peng</groupId>
<artifactId>springcloud_commom</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
第二步:配置yml文件
server:
port: 9090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.128.131:8848 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的名字
第三步:注册服务
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
第四步:创建Controller service serviceImpl
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
package com.peng.service;
import com.peng.pojo.User;
public interface UserService {
User getUserById(Integer id);
}
package com.peng.service.impl;
import com.peng.pojo.User;
import com.peng.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"张三",12);
}
}
实体类: (可以在父工程下创一个子模块springCloud_commom专门放实体类工具类,不过需要引入子模块。)
package com.peng.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_consumer:服务消费方
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--cacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.peng</groupId>
<artifactId>springcloud_commom</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
第二步:配置yml文件
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.128.131:8848 #nacos服务的地址
application:
name: nacos-consumer #向注册中心注册的名字
第三步:注册服务
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class);
}
}
创建一个ConsumerController
@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中服务的名称
}
//获取nacos中注册的指定服务信息
//通过名称获取到注册中心该服务的实例
ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
//instance.getHost() 获取该服务的ip instance.getPort()获取端口
String serviceUrl = instance.getHost() + ":" + instance.getPort();
String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);//调用该服务
}
}
启动commom provider测试:通过调用消费服务获取提供者返回的数据
注册成功的服务:
总结:
1、添加依赖
2、配置yml
3、启动类添加@EnableDiscoveryClient注册服务,并可以调用其他服务
*************************************************************************************
三、Nacos配置中心
什么是Nacos配置中心?
首先我们来看一下,微服务架构下关于配置文件的一些问题:
- 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
- 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
- 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题,配置中心的思路是:
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新
创建nacos_config子模块
第一步:添加依赖
<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>
第二步:配置yml
注意:
配置文件的名称必须为bootstrap.yml
bootstrap/ application 的应用场景 :
bootstrap.yml
比 applicaton.yml
优先加载,应用于系统级别参数配置,一般不会变动
application.yml
应用于SpringBoot项目的自动化配置;
spring:
cloud:
nacos:
config:
server-addr: 192.168.128.131:8848
file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
prefix + file-extension = nacos-config.yaml这是 Nacos的DataID名称
第三步、在启动类添加@EnableDiscoveryClient 注册服务
package com.peng;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //向nacos服务中心注册该服务,并可以获取其他服务的调用地址
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class,args);
}
}
第四步:编写ConfigController
package com.peng.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;
@RestController
@RefreshScope //重新从BeanFactroy获取一个新的实例(该实例使用新的配置)
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;
}
}
*****************************************************
往Nacos添加配置信息
在 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
配置内容:
server:
port: 8083
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.128.131:8848
application:
name: nacos-config
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
测试:
浏览器访问:http://127.0.0.1:8083/config/info
1、启动nacos-config
动态更新
修改配置文件后nacos监听到MD5有变化则推送消息给客户端,客户端收到消息后会拉取最新配置
@RefreshScope //重新从BeanFactroy获取一个新的实例(该实例使用新的配置)
当修改了nacos上的配置文件,@RefreshScope会从新获取一个新的实例,从而实现不需要重启项目就能更新配置文件。
重新访问无需重启项目
修改完后本地也会修改配置:
*************************************************************
四、配置隔离
Nacos配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集
Namespace Group DataId介绍:
Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
获取配置集需要指定:
1、nacos服务地址,必须指定
2、namespace,如不指定默认public
3、group,如不指定默认 DEFAULT_GROUP
4、dataId,必须指定
namespace隔离
前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace
新建namespace
建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡
克隆完成后test空间就有了克隆过来的配置信息了
同理创建dev开发环境命名空间同样克隆一份
此时有两个命名空间一个test 命名空间ID自动生成的,一个dev 命名空间ID我们自定义的
修改配置nacos-config的yml文件添加
namespace: dev #命名空间ID 表示这是一个开发环境
重启nacos_config(子模块)
修改dev下的配置
在访问:http://localhost:8083/config/info 此时配置指定环境下的配置文件就成功了
如果一个dev(开发环境)下有两个Group怎么指定呢?
此时有两个group相当于:一个文件夹下有俩配置文件 一个密码是:3333 一个密码是5555
此时怎么指定配置文件呢?
修改nacos-config的yml配置文件添加:
group: NACOS_GROUP #Group 名称(项目名)
重新访问:http://localhost:8083/config/info
*******************************************************
五、Nacos集群和持久化
Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql
切换数据库
修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)
1、先关闭nacos ./shutdown.sh
2、进入nacos/conf cd /usr/local/nacos/conf
3、编辑 application.properties vim application.properties
打开文件后,
1、i命令进入编辑模式 修改文件 放开配置(就是删掉#号)
2、配置要连接的数据库 配置账户名与密码
3、修改完成后 键盘左上角EXC 退出编辑模式
4、:wq保存退出即可
初始化数据库
创建nacos数据库并导入sql
usr/local/nacos/conf目录下有一个sql文件把他导入到数据库即可
测试
重启nacos测试nacos所有写到嵌入式数据库的数据是否都写到了mysql
注意mysql服务:需要开启
1、cd /usr/local/nacos/bin 进入nacos/bin目录下
2、./startup.sh -m standalone 启动nacos
此时配置文件信息已经持久化到Mysql数据库了
*******************************************************************
六、集群
部署架构图:
节点规划
节点 | 端口 |
192.168.116.131 | 8848 |
192.168.116.131 | 8849 |
192.168.116.131 | 8850 |
集群搭建
找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下
# ip:port
192.168.128.131:8848
192.168.128.131:8849
192.168.128.131:8850
复制三份Nacos
1、cd /usr/local 进入该目录下
2、mkdir nacos_cluster 创建nacos_cluster 文件夹
3、 cp -r nacos nacos_cluster/nacos_8848 /8849/8850 复制到nacos_cluster文件下并起名
conf/application.properties
中的端口号分别改为
[root@localhost bin]# cd /usr/local
[root@localhost java]# mkdir nacos_cluster
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850
server.port=8848
server.port=8849
server.port=8850
这里拿8849举例,其他俩一样,一个改8848 一个8850
启动这三个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
测试 三台nacos服务是否可以访问
http://192.168.128.131:8848/nacos
http://192.168.128.131:8849/nacos
http://192.168.128.131:8850/nacos
这时候都能访问通了,注意我这里用的linux 一台虚拟机模拟的三台服务,虚拟机分配了3个G的内存,因为前面把数据持久到mysql中了,需要先开启mysql,在开启这三个服务,访问时有可能会有点慢,多刷新刷新就好了。
箭头指向表示的是这三个服务的老大,用nginx访问nacos时不管请求到那一台,都会给老大报告,
老大自己更新下,在跟另一台说声让他也更新数据,这样就完成了三台nacos的数据统一。如果老大挂掉,活着的会继续推选个老大出来。。。。
我们还可以启动一个nacos-provider(子模块)注册一个服务看三个nacos页面会不会同步。。
启动成功,这时我们去刷新三个nacos的页面
我们发现我们在nacos-provider(子模块)yml配置了一个8848 另外两个nacos同步了该服务
此时可以进行下一步配置了。
配置代理服务
在克隆一台虚拟机安装nginx
安装nginx
第一步、安装nginx的依赖库 (这是安装C语言环境)
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
第二步、下载nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
第三步、解压安装包
tar -zxvf nginx-1.12.0.tar.gz
第四步、 配置nginx安装包
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
注意:./configure配置nginx安装到/usr/java/nginx目录下
第五步、编译并安装
make && make install
配置nginx代理nacos
cd /usr/local/nginx/conf/
修改nginx.conf文件
upstream nacos {
server 192.168.128.131:8848;
server 192.168.128.131:8849;
server 192.168.128.131:8850;
}
server {
listen 80;
server_name 192.168.128.132;
location / {
proxy_pass http://nacos;
}
}
测试
1.重新启动三台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
2、 启动nginx
[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx
启动成功后就可以通过nginx访问了(随机访问某一台nacos服务)
补充知识点,nacos开机自启动,练习时设置开机自启动,不用每次开机都手动开启服务了,实际开发中这个没啥用,因为一般不会关闭服务器,练习用用还行。。。
1、编写开机启动文件 (这里演示的是单个nacos)
添加nacos.service文件
vim /lib/systemd/system/nacos.service (创建并打开文件)
然后依次执行 i编辑模式 把下方代码复制进去 EXC退出编辑模式 :wq保存退出
[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
2、修改nacos的startup.sh
vim /usr/local/nacos/bin/startup.sh
修改JAVA_HOME路径并注销之后的3行配置,如下保存并退出
[ ! -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
3、设置开机启动
systemctl daemon-reload #重新加载服务配置
systemctl enable nacos.service #设置为开机启动
systemctl start nacos.service #启动nacos服务
systemctl stop nacos.service #停止nacos服务
最后依次启动nacos systemctl start nacos.service
重新加载该服务 systemctl daemon-reload
设置开机启动 systemctl enable nacos.service
然后就可以重启你安装的nacos机器了
启动成功:可以成功访问。。。