目录
4.1.1 Alibaba Nacos 的基本架构和概念
-
Alibaba Nacos 基本架构
- 服务、配置服务、名字服务
-
Alibaba Nacos 概念解读
- 服务注册中心:它是服务,实例以及元数据的数据库;服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求
- 服务元数据:包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
- 服务提供、消费方:提供可复用和可调用服务的应用方;会发起对某个服务调用的应用方
- 配置:在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以及独立的配置文件的形式存在
4.1.2 Alibaba Nacos 单机部署(Linux版)
4.1.2.1 下载与运行 Nacos
- 单机版本部署步骤
- 下载你所需要的版本(最新)
- https://github.com/alibaba/nacos/releases/
- tar -zxvf nacos-server-2.0.3.tar.gz
- 单机模式启动(默认配置)
- 下载你所需要的版本(最新)
[root@localhost bin]# ./startup.sh -m standalone
/usr/local/java/bin/java -Djava.ext.dirs=/usr/local/java/jre/lib/ext:/usr/local/java/lib/ext -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xloggc:/opt/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/opt/nacos/plugins/health,/opt/nacos/plugins/cmdb -Dnacos.home=/opt/nacos -jar /opt/nacos/target/nacos-server.jar --spring.config.additional-location=file:/opt/nacos/conf/ --logging.config=/opt/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /opt/nacos/logs/start.out
然后,访问 http://192.168.3.250:8848/nacos 连接失败
查看日志 /opt/nacos/logs/start.out
cksdbjni5856883071013166985.so: libstdc++.so.6: cannot open shared object file: No such file or directory
执行安装解决
yum install libstdc++.i686
4.1.2.2 Web演示
访问 http://192.168.3.250:8848/nacos
初始账户:nacos/nacos
创建 sca-commerce 命名空间
4.1.3 Nacos 配置自定义的 MySQL 持久化
- 修改配置,指定MySQL地址、用户名、端口号
4.1.3.1 准备 MySQL 数据库
- 安装 docker & docker-compose
- 运行 docket-compose
- 登录容器修改 root 密码
参考:https://hub.docker.com/_/mysql
不是这里的专门内容,所以贴一下步骤:
# 进入 mysql 容器
docker exec -it mysql bash
# 登录 mysql, 第一次密码是空,直接回车
mysql -uroot -p
# mysql8 修改密码
use mysql;
update user set authentication_string='' where user='root';
ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
# 修改帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入MySQL后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"
select host from user where user='root';
update user set host = '%' where user ='root';
flush privileges;
本人尝试过单机部署时候 mysql:8 能启动, 在集群模式下会报错的, 建议用 MySQL5.7
4.1.3.2 修改 Nacos 配置,指定 MySQL 持久化
vim /opt/nacos/conf/application.properties
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
4.1.3.3 运行 SQL语句
Nacos官方已经为我们提供了 nacos-mysql.sql 语句文件
[root@localhost conf]# ll
total 88
-rw-r--r--. 1 502 games 1224 Jun 17 22:39 1.4.0-ipv6_support-update.sql
-rw-r--r--. 1 502 games 9496 Oct 27 03:11 application.properties
-rw-r--r--. 1 502 games 9506 Jul 27 02:18 application.properties.example
-rw-r--r--. 1 502 games 670 Mar 17 2021 cluster.conf.example
-rw-r--r--. 1 502 games 31156 Jul 15 07:19 nacos-logback.xml
-rw-r--r--. 1 502 games 10660 Jun 17 22:39 nacos-mysql.sql
-rw-r--r--. 1 502 games 8795 Jun 17 22:39 schema.sql
https://github.com/eddie-code/sca-commerce/blob/develop/nacos-mysql.sql
https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
4.1.3.4 重新运行 Nacos
关闭之前启动 Nacos, 再次运行 Nacos
cd /opt/nacos/bin
./shutdown.sh
./startup.sh -m standalone
新建一个命名空间,查看是否成功
4.2.1 Alibaba Nacos 集群化部署(Linux版)
- 集群化部署 Alibaba Nacos 的步骤
- 定义集群部署的 IP 和 端口,即 cluster.conf 文件
- 集群必须要使用可以共同访问(例如:MySQL、PG等等)到的数据源作为持久化方式
- 集群化启动没有额外的参数:./startup.sh
至少需要三个 Nacos 节点
4.2.1.1 修改 cluster.conf 文件
复制 example
cd /opt/nacos/conf/
cp cluster.conf.example cluster.conf
vim cluster.conf
192.168.3.250:8848
192.168.3.250:8858
192.168.3.250:8868
4.2.1.2 创建 Nacos 节点
拷贝 nacos 文件夹
[root@localhost opt]# ll
total 314696
drwxr-xr-x. 7 root root 96 Oct 27 00:52 nacos
-rw-r--r--. 1 root root 117593603 Oct 27 00:49 nacos-server-2.0.3.tar.gz
[root@localhost opt]#
[root@localhost opt]# cp -r nacos nacos-8848
[root@localhost opt]# cp -r nacos nacos-8858
[root@localhost opt]# cp -r nacos nacos-8868
[root@localhost opt]# ll
total 314696
drwxr-xr-x. 7 root root 96 Oct 27 00:52 nacos
drwxr-xr-x. 7 root root 96 Oct 27 04:30 nacos-8848
drwxr-xr-x. 7 root root 96 Oct 27 04:30 nacos-8858
drwxr-xr-x. 7 root root 96 Oct 27 04:30 nacos-8868
-rw-r--r--. 1 root root 117593603 Oct 27 00:49 nacos-server-2.0.3.tar.gz
[root@localhost opt]#
修改 application.properties 的端口
vim /opt/nacos-8858/conf/application.properties
server.port=8858
vim /opt/nacos-8868/conf/application.properties
server.port=8868
4.2.1.3 执行三个 Nacos 节点的启动脚本
vim nacos-cluster-startup.sh
sh /opt/nacos-8848/bin/startup.sh
sh /opt/nacos-8858/bin/startup.sh
sh /opt/nacos-8868/bin/startup.sh
chmod 777 nacos-cluster-startup.sh
关闭脚本也是一样操作
进入 Web 查看:http://192.168.3.250:8848/nacos
4.3.1 Alibaba Nacos Client服务注册与发现
4.3.1.1 服务注册
创建 Nacos Client 子项目
工程名:sca-commerce-alibaba-nacos-client
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>sca-commerce</artifactId>
<groupId>com.edcode.commerce</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-commerce-alibaba-nacos-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 模块名及描述信息 -->
<name>sca-commerce-alibaba-nacos-client</name>
<description>Nacos Client</description>
<dependencies>
<!-- spring cloud alibaba nacos discovery 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.edcode.commerce</groupId>
<artifactId>sca-commerce-mvc-config</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
-->
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 配置远程仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
NacosClientApplication 启动类
package com.edcode.commerce;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author eddie.lee
* @blog blog.eddilee.cn
* @description Nacos Client 工程启动入口
*/
@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
bootstrap.yml
server:
port: 8000
servlet:
context-path: /scacommerce-nacos-client
spring:
application:
name: sca-commerce-nacos-client # 应用名称也是构成 Nacos 配置管理 dataId 字段的一部分 (当 config.prefix 为空时)
cloud:
nacos:
# 服务注册发现
discovery:
enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
#server-addr: ${NACOS_ADDR:127.0.0.1}:8848
server-addr: ${NACOS_ADDR:127.0.0.1}:8848,${NACOS_ADDR:127.0.0.1}:8849,${NACOS_ADDR:127.0.0.1}:8850 # Nacos 服务器地址
namespace: ${NAMESPACE_ID:1adcfdd8-5763-4768-9a15-9c7157988950}
# 暴露端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
启动项目,在查看 Nacos Web
4.3.1.2 服务发现
NacosClientService
package com.edcode.commerce.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author eddie.lee
* @blog blog.eddilee.cn
* @description
*/
@Slf4j
@Service
public class NacosClientService {
private final DiscoveryClient discoveryClient;
public NacosClientService(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient;
}
/**
* 打印 Nacos Client 信息到日志
* @param serviceId
* @return
*/
public List<ServiceInstance> getNacosClientInfo(String serviceId) {
log.info("request nacos client to get service instance info: [{}]", serviceId);
return discoveryClient.getInstances(serviceId);
}
}
NacosClientController
package com.edcode.commerce.controller;
import com.edcode.commerce.service.NacosClientService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author eddie.lee
* @blog blog.eddilee.cn
* @description
*/
@Slf4j
@RestController
@RequestMapping("/nacos-client")
@RequiredArgsConstructor
public class NacosClientController {
private final NacosClientService nacosClientService;
/**
* 根据 service id 获取服务所有的实例信息
*/
@GetMapping("/service-instance")
public List<ServiceInstance> logNacosClientInfo(@RequestParam(defaultValue = "sca-commerce-nacos-client") String serviceId) {
log.info("coming in log nacos client info: [{}]", serviceId);
return nacosClientService.getNacosClientInfo(serviceId);
}
}
使用 IDEA 或者 PostMan请求 API