12

SpringCloud学习记录 - Nacos

 3 years ago
source link: https://tomoya92.github.io/2021/02/02/spring-cloud-alibaba-nacos/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:朋也

日期:2021-02-02

版权声明:自由转载-非商用-非衍生-保持署名( 创意共享3.0许可证

Nacos是啥?

Nacos是alibaba将不在更新的 config, ribbon, bus等模块给整合的一个包,并且在维护更新,相当于以后用config或者负载均衡等服务就只需要引入一个nacos就够了

Hello World

首先下载nacos,官网:https://nacos.io/zh-cn/docs/quick-start.html

本文用的版本是 1.4.0

启动成功后,访问:http://localhost:8848/nacos/index.html 用户名: nacos 密码: nacos

接下来创建项目, 我这创建了两个服务提供者用于测试

nacos-provider1

依赖

<!-- 这个依赖是配置在根目录下的pom.xml里的 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<!-- 下面是模块里的依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <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-discovery</artifactId>
    </dependency>
</dependencies>

application.properties

server.port=28081

spring.application.name=nacos-provider

spring.cloud.nacos.discovery.server-addr=localhost:8848

management.endpoints.web.exposure.include=*

启动类 NacosProvider1Application.java

package com.example.springcloudtutorial;

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

@EnableDiscoveryClient // 一定要加上这个注解, 否则nacos发现不了服务
@SpringBootApplication
public class NacosProvider1Application {

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

}

第二个服务的端口为 28082

分别启动两个服务, 然后打开nacos的控制台

2uEZfiR.png!mobile

负载均衡

nacos自带了负载均衡的功能,原因是它把ribbon给引入了

JnUnArN.png!mobile

下面实现一下负载均衡

先在两个服务提供者中添加上一个服务

package com.example.springcloudtutorial;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@EnableDiscoveryClient
@SpringBootApplication
@RestController
public class NacosProvider1Application {

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

    @GetMapping("/getOrder")
    public Object getOrder() {
        return "order list " + port;
    }

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

创建消费者模块 nacos-consumer

依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <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-discovery</artifactId>
    </dependency>
</dependencies>

配置文件

server.port=28083

spring.application.name=nacos-consumer

spring.cloud.nacos.discovery.server-addr=localhost:8848

management.endpoints.web.exposure.include=*

启动类

package com.example.springcloudtutorial;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @GetMapping("/consumer/getOrder")
    public Object getOrder() {
        return restTemplate().getForEntity("http://nacos-provider/getOrder", String.class);
    }

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

消费者中请求的地址写的是 http://nacos-provider 这个 nacos-provider 就是服务提供者的 spring.application.name

在注入 restTemplate 的时候添加上 @LoadBalanced 实现负载均衡的实现,默认是轮询

分别启动服务,nacos控制台里可以看到有2个服务提供者,一个服务消费者

7ZBJBb2.png!mobile

浏览器访问 http://localhost:/consumer/getOrder 不停的刷新会看到输出的端口是轮换输出的

配置管理Config

nacos控制台自带了配置文件编写发布的功能

Y3AvQrn.png!mobile

打开配置页面如下

eEJFVnm.png!mobile

其中 dataId 配置规则是 ${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

创建一个配置文件,名为:nacos-consumer-dev.properties 内容如下,然后保存发布

site.name=nacos-consumer,version=1

在模块 nacos-consumer1 里添加下面依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

其中这个依赖 spring-cloud-starter-bootstrap 必须要加,如果不加的话, bootstrap.properties 文件将不加载

application.properties 修改如下

spring.profiles.active=dev
server.port=28083

新建 bootstrap.properties

spring.application.name=nacos-consumer

spring.cloud.nacos.discovery.server-addr=localhost:8848

spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.prefix=${spring.application.name}

management.endpoints.web.exposure.include=*

启动类上添加 @RefreshScope 注解用来更新修改的配置信息,同时获取一下配置文件里的值

package com.example.springcloudtutorial;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosConsumerApplication {

    @Value("${site.name:}")
    private String name;

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @GetMapping("/consumer/getOrder")
    public Object getOrder() {
        return restTemplate().getForEntity("http://nacos-provider/getOrder", String.class).getBody() + " " + name;
    }

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

浏览器访问:http://localhost:28083/consumer/getOrder 输出内容 order list 28082 nacos-consumer,version=1

去nacos控制台里修改一下配置文件内容后保存发布,回到IDE,会看到已经通知到项目刷新配置信息了

M3A3Mv2.png!mobile

再次访问,输出的 site.name 内容也是最新的了

上面介绍了dataid的配置规则跟项目中的配置,nacos除了dataid还提供了两个划分环境的变量,group,namespace

在nacos控制台上创建配置文件的时候,有个选项默认值是 DEFAULT_GROUP, 通过更改这个值就可以将配置文件分配到不同的组中,在项目中只需要通过 spring.cloud.nacos.config.group=DEFAULT_GROUP 来指定不同的组即可

命名空间 namespace

在上一小段里说到了配置文件有三个变量,其中dataid和group都介绍了,还剩一个namespace,单独拿出来介绍是因为服务(不止配置中区分)也可以区分命名空间

首先在控制台上创建一个namespace

fM7JJzj.png!mobile

然后复制命名空间ID,贴到项目中的配置文件里,对应的配置项如下

# 服务的namespace
spring.cloud.nacos.discovery.namespace=58ee0281-11e6-4ffe-90f2-e84f00d15bb0

# 配置文件的namespace
spring.cloud.nacos.config.namespace=58ee0281-11e6-4ffe-90f2-e84f00d15bb0

注意,如果服务配置了命名空间,那么互相调用的服务都要保持在一个命名空间里才能被发现到

MySQL

nacos默认数据存储在一个内置的数据库里(derby),下面介绍一下怎么切换到MySQL数据库

官方文档:https://nacos.io/zh-cn/docs/deployment.html

首先创建一个数据库,名为: nacos-config, 然后打开nacos安装目录下的 conf 文件夹,找到 nacos-mysql.sql 文件直接在数据库里执行即可

最后找到 conf/application.properties 文件,在最下面添加下面配置即可, 注意数据库名密码要换成自己的

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=123123

重启nacos即可


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK