【Spring Cloud Alibaba 温故而知新】(一)Alibaba Nacos | Eddie'Blog
【Spring Cloud Alibaba 温故而知新】(一)Alibaba Nacos

【Spring Cloud Alibaba 温故而知新】(一)Alibaba Nacos

eddie 271 2021-10-29

目录

4.1.1 Alibaba Nacos 的基本架构和概念

  • Alibaba Nacos 基本架构

    • 服务、配置服务、名字服务
  • Alibaba Nacos 概念解读

    • 服务注册中心:它是服务,实例以及元数据的数据库;服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求
    • 服务元数据:包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
    • 服务提供、消费方:提供可复用和可调用服务的应用方;会发起对某个服务调用的应用方
    • 配置:在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以及独立的配置文件的形式存在

4.1.2 Alibaba Nacos 单机部署(Linux版)

4.1.2.1 下载与运行 Nacos

[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

在这里插入图片描述
在这里插入图片描述


# SpringCloud