Nacos-docker环境部署与被SpringcloudAlibba集成使用

目录

一、docker环境安装部署Nacos

三、nacos管理平台部分讲解

四、Springcloud集成nacos

五、nacos-config


一、docker环境安装部署Nacos

1、镜像获取

//查询Nacos镜像
docker search nacos
//拉取镜像
docker pull nacos/nacos-server
//查看镜像
docker images

2、查询当前docker可用的网络通信(容器内部使用)

docker network ls

选择bridge作为Nacos通信网络,或者也可用自己创建一个,name为:common-network

docker network create common-network

3、创建容器并启动Nacos

docker run --name nacos --network bridge  -e JVM_XMS=64m -e JVM_XMX=64m -e JVM_XMN=16m -e NACOS_AUTH_ENABLE=true -e MODE=standalone -p 8849:8848 -d nacos/nacos-server

注意:--network是指定网络的

考虑到测试环境很多人都使用的阿里云的服务器,内存较小,可用将下面参数都设置小一点,否则会出现内存爆满服务器直接卡死的现象

Xms 是指设定程序启动时占用内存大小
Xmx 是指设定程序运行期间最大可占用的内存大小
Xmn 新生代的大小

4、设置开启自动启动Nacos

docker update --restart=always nacos

4、查看Nacos是否启动成功

docker ps

 如果能看到nacos在列表中,表示创建并启动成功了

5、访问nacos平台

ip:port+/nacos/index.html     例如 127.0.0.1:8849/nacos/index.html

二、为nacos配置数据库持久化

以下为配置数据库操作,如仅测试使用可不用配置

1、进入nacos容器中

docker exec -it nacos /bin/bash

2、修改application.properties配置文件

 vi conf/application.properties 

 修改以上位置,分别是数据库类型、ip、端口、数据库名、用户名、密码

mysql的容器ip可以通过以下指令查看(最后的mysql为容器名字)

 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql


或者 



docker inspect mysql| grep IPAddress

最终修改为:(我的)

 红框框出来的部分,也就是填写数据源类型的部分,要把双引号去掉。

 3、指定完了数据库后需要创建相关数据库与表

3.1创建名字为nacos的数据库

3.2访问下面网址获取表结构

https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql 

3.3创建好表之后重启nacos

docker restart nacos

三、nacos管理平台部分讲解

服务分类:

 ①代表命名空间,②代表分组,能够通过这两个精确的找到一个服务。命名空间类似一级分类,可以用来区分项目。分组类似二级分类,可以用来区分开发环境。

雪崩保护:

 在服务详情中,可以添加一个服务阈值,设置在0-1之间的数值,当同一个服务名的多个实例中,健康实例/所有实例<服务阈值的时候,就会开启雪崩保护,会将不健康的实例也拿来提供服务,以达到负载均衡的目的,分担实例压力防止服务压力过大而崩溃,但是后面会通过专门的服务管控sentinel进行管理,一般nacos不负责管理这个。

元数据:

当启动服务的时候时可以获取到nacos服务中的元数据的,例如在元数据中加一个”version“=1,可以通过获取version的版本来动态的调用服务等

心跳机制:

nacos服务注册的时候会调用addBeatInfo创建一个延时定时心跳任务beatTask,调用nacos服务端的/instance/beat接口,nacos服务会每隔5秒会发送一个心跳。nacos服务端收到nacos注册后,会创建一个延时定时的任务(ClientBeatCheckTask),在nacos集群模式下会根据服务数量进行hash取模,得到的服务机器进行处理任务,定时判断nacos实例客户端是否还存活,如果超过15秒还是还没收到客户端的心跳,则会更新实例的healthy属性为false,如果超过30秒还没有收到心跳,则会直接剔除该实例,调用deleteIp方法对该实例进行注销,如果实例重新发送心跳,需要重新注册

四、Springcloud集成nacos

1、依赖springboot、springcloudalibaba的版本依赖控制以及nacos-discovery依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>abc</groupId>
    <artifactId>abc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.2.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR9</spring.cloud.version>
    </properties>


    <dependencies>
        <!--SpringBoot基本场景启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--nacos-服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--SpringBoot 测试的场景启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--SpringBoot的版本管理-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>


            <!--Spring Cloud的版本管理-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

2、在启动配置类中添加注解@EnableDiscoveryClient,启动发现注册功能,高版本springboot可以不用添加

@SpringBootApplication
@EnableDiscoveryClient
public class application {

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

}

3、在application.yaml中加入nacos相关配置

server:
  port: 8021
# 应用名称 (nacos会将该名称当做服务名称)
spring:
  application:
    name: stock-service
  cloud:
    nacos:
      discovery:
        server-addr: 120.79.10.136:8848    #nacos服务器的ip+端口
        username: nacos
        password: nacos
        # namespace: public  # 相同特征的服务进行归类分组管理
        # ephemeral: false  # 默认=true(临时实例)  当服务宕机 超过心跳 就会将实例剔除掉
        #永久实例   哪怕宕机了也不会删除实例  当服务宕机 永远不会剔除掉
        #group的相同特征的服务进行归类分组管理
        #weight:  通常要结合 安装 权重的负载均衡策略, 权重越高分配的流量就越大
        #metadata: version=1  可以结合元数据做扩展

五、nacos-config

开启权限控制:

需要修改nacos的配置文件application.properties

nacos.core.auth.enabled=true

当开启该配置的时候,java配置文件中就不能省略nacos的username和password

启用nacos-config作为配置中心

1、引入依赖

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

2、编写配置中心地址,添加bootstrap.properties,在不做任何设置的情况下,nacos会默认读取当前服务名.properties文件作为配置文件

spring.application.name=nacos-config
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

添加配置文件的几种方式以及优先级

首先要先选择使用的命名空间,现在nacos平台上找到命名空间的ID,然后通过代码绑定

  

 spring.cloud.nacos.config.namespace=05b97916-0a8e-49e5-a59a-ececb63539e3

一、默认配置文件

会自动找到服务名.properties作为默认的配置文件例如当前服务名是nacos-config,那么默认的配置文件就是nacos-config.properties,如果现存的配置文件,后置不是properties,例如nacos-config.yml,可以通过以下代码修改默认配置文件以及profile文件后缀名

spring.cloud.nacos.config.file-extension=yaml

二、profile配置

与springboot的profile使用基本相同,不同的是命名,这里仍然是以服务名+profile+后缀名作为配置文件,例如nacos-config-dev.properties。然后通过以下代码开启

spring.profiles.active=dev

三、通过extensionConfigs的方式

properties:
spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh=true

yml:
spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - data-id: common.yaml
            group: REFRESH_GROUP
            refresh: true
          - data-id: common1.yaml
            group: REFRESH_GROUP
            refresh: true

四、通过sharedConfigs的方式

spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh=true

优先级

profile>默认>extensionConfigs>sharedConfigs

同一类型中后面的覆盖前面的,

更新远程配置信息

使用nacos-config的好处之一就是可以实现不重启服务直接更新配置文件,并且服务也能识别到最新的配置文件,只需要再nacos上发布最新的配置即可,nacos每10毫秒就会去比对配置文件的md5,当文件更新后,md5就会发生改变。当检测到不同的时候,就会将最新的配置信息拉取到服务上,一秒钟之内就可以完成拉取。(nacos1.4也有一个bug,就是java程序上的配置nacos信息的文件中,如果命名空间选择的是public,那么最好不要在显示声明命名空,否则会不断的拉取远程配置,即便远程配置文件没有更新,nacos客户端和nacos服务器的版本不一致也可能会出现这个问题

命名空间-分组-DataId的最佳实践方式

  • namespace命名空间:代表不同环境,比如开发、测试、生产
  • group分组:代表项目
  • DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件

@RefreshScope

@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解,只需要加载类上面即可

@RestController
@RefreshScope
public class TestController {

    @Value("${common.age}")
    private String age;

    @GetMapping("/common")
    public String hello() {
        return age;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值