Spring Cloud Alibaba Nacos服务注册与配置中心

文章目录

    • Spring Cloud Alibaba相关网站
    • Nacos简介
    • 安装并运行Nacos
    • Nacos的服务提供者
    • Nacos的服务消费者
    • Nacos之服务配置中心 - 基础配置
    • Nacos之服务配置中心 - 分类配置
    • Nacos集群架构和持久化配置(重要)
    • Nacos在Linux上安装、配置、集群启动

Spring Cloud Alibaba相关网站

Spring Cloud Alibaba官网:https://spring.io/projects/spring-cloud-alibaba
Spring Cloud Alibaba在github上的网址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
学习文档网址:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html


Nacos简介

1. 为什么叫Nacos?
前四个字母分别为Naming 和 Configuration 的前两个字母,最后的s为Service。——服务命名注册

2. 是什么?
官话:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
讲人话:Nacos就是 注册中心 + 配置中心 的组合。 等价于
Nacos = Eureka + Config +Bus
(它是一个用java语言开发的springboot项目)

3. 去哪下?
中文官网:https://nacos.io/zh-cn
各个版本下载:https://github.com/alibaba/nacos/tags


安装并运行Nacos

解压安装包,直接运行bin目录下的startup.cmd即可 (本次安装是windows下的安装比较简单)
Spring Cloud Alibaba Nacos服务注册与配置中心_第1张图片
命令运行成功后直接访问 http://localhost:8848/nacos
Spring Cloud Alibaba Nacos服务注册与配置中心_第2张图片
默认账号密码都是 nacos
登录后界面:
Spring Cloud Alibaba Nacos服务注册与配置中心_第3张图片


Nacos的服务提供者

pom配置文件:
1)父项目配置:

<dependencyManagement>
	<dependencies>
		<dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.2.5.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
	dependencies>
<dependencyManagement>

2)子项目pom配置


        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <version>0.9.0.RELEASEversion>
        dependency>

application配置:

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   # 配置Nacos地址
management:
  endpoints:
    web:
      exposure:
        include: '*'

主方法:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

测试服务的代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverport: "+serverPort+"\t id"+id;
    }
}

启动之后,nacos服务界面:
Spring Cloud Alibaba Nacos服务注册与配置中心_第4张图片

为了演示nacos的负载均衡,参照9001新建9002,这里不做演示

Nacos天生就可以负载均衡,因为它内部也集成了Ribbon,看下图:
Spring Cloud Alibaba Nacos服务注册与配置中心_第5张图片


Nacos的服务消费者

这里我使用openFeign进行测试服务间的调用,因此依赖、注解需要额外配置openfeign的

pom配置文件:


        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <version>0.9.0.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

application配置文件:

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848     # 注册到nacos服务的地址

主方法:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

OpenFeign服务接口代码:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Service
@FeignClient("NACOS-PAYMENT-PROVIDER")
public interface PaymentFeignService {

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id);
}

Controller层测试代码:

import com.coderzpw.springcloud.alibaba.service.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderNacosController {

    @Autowired
    private PaymentFeignService paymentFeignService;

    @GetMapping("/order/paymentInfo/{id}")
    public String paymentInfo (@PathVariable("id") Integer id){
        return paymentFeignService.getPayment(id);
    }
}

演示效果:
在这里插入图片描述
在这里插入图片描述


Nacos之服务配置中心 - 基础配置

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级的,bootstrap优先与application

pom配置文件:


        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
            <version>0.9.0.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <version>0.9.0.RELEASEversion>
        dependency>

bootstrap配置:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848     # nacos服务注册中心地址
      config:
        server-addr: localhost:8848     # nacos作为配置中心地址
        file-extension: yml             # 指定yml格式的配置
        #group: SpringCloud_Alibaba      # 指定分组, 可以不加group,则默认选择DEFAULT_GROUP组
        #namespace: 2efe7528-33ef-49c4-bc8f-e52347c7cfd3   # 指定namespace, 可以不加namespace, 则默认选择public的命名空间


# Nacos上全局配置文件命名规则(Data Id): ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 前缀-开发环境类型(dev/test).文件类型(yml/properties)    例如:nacos-config-client-dev.yml

application配置:

spring:
  profiles:
    active: dev       # 表示开发环境
    #active: test       # 表示开发环境

主方法:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

测试代码:

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  // 支持Nacos的动态刷新功能
public class configController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/Info")
    public String getConfigInfo (){
        return configInfo;
    }
}

在Nacos服务界面配置全局配置文件:
Spring Cloud Alibaba Nacos服务注册与配置中心_第6张图片
Spring Cloud Alibaba Nacos服务注册与配置中心_第7张图片
配置成功之后测试:
在这里插入图片描述
Nacos是可以动态刷新的(如果Nacos界面端修改了配置文件,咱们的项目不需要重新启动也可以获取更新的值,比spring config方便)


Nacos之服务配置中心 - 分类配置

命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。

配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集。可以定义一个group为:STUDENT_GROUP。

配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即DataID。
在Nacos Spring Cloud中,项目匹配dataId的完整格式如下

${prefix}-${spring.profile.active}.${file-extension}
  • prefix默认为spring.application.name的值,也可以通过配置项是spring.cloud.nacos.config.prefix来配置
  • spring.profile.active即为当前环境对应的profile。注意:当spring.profile.active为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
  • file-extension为配置文件的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持propertiesyml类型

最佳实践
Nacos抽象定义了Namespace、Group、Data ID的概念,具体这几个概念代表什么,取决于我们把它们看成什么,这里推荐给大家一种用法,如下图:
Spring Cloud Alibaba Nacos服务注册与配置中心_第8张图片

Namespace :代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
Spring Cloud Alibaba Nacos服务注册与配置中心_第9张图片


Nacos集群架构和持久化配置(重要)

Nacos集群部署架构

http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式

官网架构图:Spring Cloud Alibaba Nacos服务注册与配置中心_第10张图片
下面是一个相对容易理解的图:
Spring Cloud Alibaba Nacos服务注册与配置中心_第11张图片
默认Nacos使用嵌入式数据库(derby)实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储

derby到mysql切换配置步骤

1)在nacos-server-1.1.4\nacos\conf目录下找到nacos-mysql.sql脚本
Spring Cloud Alibaba Nacos服务注册与配置中心_第12张图片
2)执行脚本,执行之后的表(nacos_config数据库可以先自己创建再导入表)
Spring Cloud Alibaba Nacos服务注册与配置中心_第13张图片

3)修改\nacos\conf目录下的application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
在最后加入一下配置:

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

4)重启Nacos服务
Spring Cloud Alibaba Nacos服务注册与配置中心_第14张图片
5) 重新创建配置文件
Spring Cloud Alibaba Nacos服务注册与配置中心_第15张图片
6)查看mysql里的数据
在这里插入图片描述
说明由Nacos内置数据库切换到外部数据库-mysql成功


Nacos在Linux上安装、配置、集群启动

预计需要,1个Nginx + 2个Nacos服务 + 1个Mysql

配置Nginx

这里我的Linux服务器上已经安装过了Nginx,我计划启动两个Nacos服务
localhost:8801localhost:8802
上Nginx配置:
Spring Cloud Alibaba Nacos服务注册与配置中心_第16张图片

配置启动2个Nacos服务并指定数据源Mysql

计划:复制两份Nacos,一个端口号设为8801,另一个设为8802

1) 集群配置

进入nacos/conf目录
然后根据cluster.conf.example复制一个cluster.conf(很关键

cp cluster.conf.example cluster.conf		# 复制一份cluster.conf

修改cluster.conf配置文件

vim cluster.conf

Spring Cloud Alibaba Nacos服务注册与配置中心_第17张图片

2)指定mysql数据源配置
修改nacos/conf目录下的application.properties(Nacos主要的配置文件

vim application.properties

在最后面加入配置(和在Windows上配置一样):

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

3)修改Nacos启动时默认消耗的JVM内存大小
因为Nacos在启动时默认会占用很大的JVM内存,如果我们启动两台或多台Nacos服务,可能最后只能启动成功一台o(╥﹏╥)o,因此我们需要修改一下默认启动消耗的JVM内存大小

修改nacos/bin目录下的启动命令文件——startup.sh(重要

vim startup.sh

Spring Cloud Alibaba Nacos服务注册与配置中心_第18张图片

4)将nacos复制成两份
在这里插入图片描述
然后分别修改他们的端口号,端口号配置也在application.properties里
Spring Cloud Alibaba Nacos服务注册与配置中心_第19张图片
5)分别启动Nacos服务
集群启动命令是: ./startup.sh(linux中)
单机启动的命令是: ./startup.sh -m standalone
启动时 可以查看动态日志

tail -f ../logs/nacos.log		# 查看动态日志

如果没有启动成功的话,里面会有详细报错信息,让你更加快速地定位错误原因,可以省去很多调试时间。

这里我们选择集群启动,分别对他们进行启动!!!

完成,撒花!!!!(〃‘▽’〃)(〃‘▽’〃)(〃‘▽’〃)

你可能感兴趣的:(分布式微服务,SpringCloud,java)