Nacos

Nacos

_

官方地址

官方地址

下载地址

下载地址

docker安装

docker run --name nacos --net mynet -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.1.4

启动

windows

启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

访问

http://localhost:8848/nacos

用户名+密码=nacos

nacos01.png

父项目

创建父项目

cloud2021

依赖

     <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <cloud.version>Hoxton.SR11</cloud.version>
        <cloud-alibaba.version>2.2.1.RELEASE</cloud-alibaba.version>
    </properties>

    <parent>
        <artifactId>spring-boot-dependencies</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.10.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencyManagement>

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${cloud-alibaba.version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

子项目

创建子项目

cloud-alibaba-provider-payment9001
cloud-alibaba-provider-payment9002

依赖

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

配置文件

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

controller

@RestController
public class PaymentController {

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

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

}

启动类

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

效果

nacos02.png

nacos03.png

负载均衡

nacos04.png

nacos集成了ribbon,可以直接使用负载均衡

创建consumer

创建:cloud-alibaba-consumer-nacos-order83

依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

在最新的2.1.0版本中,已经放弃ribbon,需要导入loadbalancer

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

配置文件

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#配置消费者要去访问的微服务名称
server-url:
  nacos-user-service: http://nacos-payment-provider

配置类

@Configuration
public class MyConfig {

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

controller

@RestController
public class OrderNaCosController {

    @Resource
    private RestTemplate restTemplate;

    //获取在配置文件中配置的url
    @Value("${server-url.nacos-user-service}")
    private String url;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id){
        return restTemplate.getForObject(url+"/payment/nacos/"+id,String.class);
    }

}

启动类

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

结果

nacos05.png

访问同一个接口,分别调用了9001和9002
nacos06.png

nacos07.png

负载均衡策略

策略类 命名 描述
RandomRule 随机策略 随机选择server
RoundRobinRule 轮询策略 轮询选择, 轮询index,选择index对应位置的Serve
RetryRule 重试策略 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server
BestAvailableRule 最低并发策略 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
AvailabilityFilteringRule 可用过滤策略 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态
ResponseTimeWeightedRule 响应时间加权重策略 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
ZoneAvoidanceRule 区域权重策略 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

我们可以通过修改配置来调整Ribbon的负载策略

nacos-payment-provider:  #要负载调用的服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

服务配置中心

创建module: cloud-alibaba-config-nacos-client3377

依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

在最新的SpringCloud 2021.0.2版本中,如果需要加载bootstrap.yml,需要导入spring-cloud-starter-bootstrap

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

配置文件

创建:
application.yml
bootstrap.yml

application.yml

spring:
  profiles:
    active: dev  #环境

bootstrap.yml:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: localhost:8848   #nacos作为配置中心地址
        file-extension: yaml          #nacos配置文件的类型
      discovery:
        server-addr: localhost:8848   #nacos注册中心地址

controller

@RestController
@RefreshScope //Spring Cloud 原生注解,实现配置自动更新
@RequestMapping("/config")  
public class ConfigController {

    @Value("${config.info:c}")
    private String info;

    @RequestMapping("/get")
    public String getInfo(){
        return info;
    }
}

启动类

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

nacosconfig配置

浏览器输入 localhost:8848/nacos 进入控制台

nacos08.png

nacos09.png

点击配置列表右边➕新建配置

配置类容如图所示

文件名官方说明
nacos10.png

结果

nacos11.png

集群和持久化

这里使用linux.

将nacos上传至linux解压缩

application.propertiescluster.conf.example进行备份
其中将 cluster.conf.example 备份为 cluster.conf

nacos13.png

持久化

官方文档:
官方
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+
  2. 创建数据库nacos_config
  3. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql(在conf目录下)
  4. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql

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

直接创建数据库nacos_config

然后执行nacos/config/nacos-mysql.sql sql脚本,创建表

在配置文件application.properties中加入:
nacos14.png

👌👌👌👌👌👌👌👌👌👌👌👌👌👌

集群

一台linux上不同端口的集群---------------
🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬

在上面cp的配置文件cluster.conf中加入naocs地址(ip+端口)

192.168.0.231:3333
192.168.0.231:4444
192.168.0.231:5555

如图,将自带的注释掉,加入我们集群的地址

nacos15.png

然后进入nacos/bin目录

naos16.png

startup.sh进行备份

nacos17.png

更改startup.sh
nacos18.png

nginx配置

nacos19.png

nacos启动

./startup.sh -g 3333
./startup.sh -g 4444
./startup.sh -g 5555

依次启动
nacos21.png

三台服务器集群---------------

🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬

上传文件解压 什么的都一样

备份文件,修改配置文件application.properties

nacos24.png

修改cluster.conf

nacos25.png

nacos自己的配置一启动就是几个g的内存占用,对于我们只有2-4个g内存的服务器来说直接跑不起来-------------

😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨
所以我们需要调一下配置。

直接修改启动文件--------------->start.sh(记得备份😂😂😂😂)

测试着玩,随便调吧,想给多少给多少
nacos26.png

然后挨个启动

nacos27.png

nginx负载均衡

nainx.conf配置
nacos28.png

访问一个地址,可以实现在集群中三台nacos中丝滑切换

ojbk

😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴

nacos29.png

这是因为,nacos在启动的时候直接去hosts里面获取了本地的ip,如果部署在服务器上,就是服务器的内网ip,导致访问不到,在服务注册的时候拿着服务器的ip去本地找,能找到就有鬼了。。当然,在同一局域网就不说了

nacos30.png

解决办法:

application.properties配置文件中配置启动ip就好。

nacos31.png

记得删除cluster.conf配置文件中的内网ip

GIt 2021-04-29
Swagger 2021-05-18

评论区