草庐IT

Spring Cloud Alibaba组件之Nacos

gagaxiang 2023-04-16 原文

目录结构:

  一、Spring Cloud Alibaba简介

  二、使用版本情况

  三、什么是Nacos?

  四、Nacos运行环境部署

  五、Nacos注册中心

  六、Nacos命名空间和分组

  七、Nacos配置中心

  八、基于profile多环境配置

  九、Nacos配置中心动态刷新

  十、Nacos数据持久化

  十一、Nacos集群部署

一、Spring Cloud Alibaba简介

Spring Cloud Alibaba是Spring Cloud下的一个子项目,Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案,它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序,使用Spring Cloud Alibaba,您只需要添加一些注解和少量配置即可将Spring Cloud应用程序整合Alibaba的分布式解决方案,并使用Alibaba中间件构建分布式应用程序系统。

二、使用版本情况

1、项目所使用的的版本

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2.2.9.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE

2、Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本:

Spring Cloud Alibaba Version Nacos Version Sentinel Version Seata Version RocketMQ Version Dubbo Version
2.2.9.RELEASE 2.0.4 1.8.5 1.5.2 4.9.4 2.7.13

三、什么是Nacos?

Nacos是阿里巴巴2018年7月推出来的一个开源项目,是一个构建微服务应用的服务注册与发现、配置管理平台;

Nacos 属于Spring Cloud Alibaba下的一个组件;

Nacos 约等于 Spring Cloud Eureka(注册中心)+ Spring Cloud Config(配置中心)

Nacos官网:https://nacos.io/

四、Nacos运行环境部署

服务端(部署一个nacos-server)+ 客户端(你的各个服务)

步骤:

  1、下载Nacos的二进制压缩包

  下载地址:https://github.com/alibaba/nacos/releases

  2、解压下载下来的Nacos的二进制压缩包  

  tar -zxvf nacos-server-2.0.4.tar.gz

  3、启动nacos server

  [root@localhost bin]# ./startup.sh -m standalone

  注:单机环境必须带-m standalone参数启动,否则无法启动,不带参数启动的是集群环境

  4、访问nacos的web客户端地址:http://ip地址:8848/nacos

  使用默认的用户名:nacos、密码:nacos

  5、关闭nacos server

  [root@localhost bin]# ./shutdown.sh

五、Nacos注册中心

Nacos注册中心可以说是类似于Eureka-server的功能

微服务开发是controller调用controller,调用者是服务消费者,被调用者是服务提供者,服务消费者和服务提供者是相对概念,服务消费者也可以被另一个服务调用,那么此时的服务消费者也是一个服务提供者;

在实际开发中,我们会把所有服务都注册到nacos注册中心上,由nacos去维护和管理我们的所有服务。

5.1、实现服务提供者

1、pom.xml 文件中引入Nacos Discovery Starter依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

2、配置文件application.yml中添加Nacos Server地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos

  application:
    name: nacos-provider

注意:如果不想使用Nacos作为你的服务注册与发现,可以将spring.cloud.nacos.discovery.enabled 设置为 false。

3、启动项目,此时就可以在Nacos的web管控台上看到注册上来的服务信息了;

 5.2、实现服务消费者

消费者应用比提供者应用要稍微复杂一点,因为在消费端需要去调用提供者提供的REST服务,此时需要用到RestTemplate、OpenFeign及负载均衡Spring Cloud LoadBalancer。

1、添加OpenFeign、Nacos Discovery Starter依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、配置文件application.yml中添加Nacos Server地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos

  application:
    name: nacos-consumer

3、新建Feign接口,调用服务提供者

// nacos-provider是服务提供者的应用名,也就是注册到Nacos中的应用名
@FeignClient(value = "nacos-provider")
public interface ProductFeign {
    // 服务提供者对应的controller接口
    @GetMapping("/product/{id}")
    Product getProduct(@PathVariable("id") Integer id);
}

4、服务消费者接口实现类中注入Feign对象,调用服务提供者

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderDao orderDao;
    @Resource
    private ProductFeign productFeign;
    @Override
    public int addOrder(Integer id) {
        // 注入Feign接口对象,调用服务提供者接口
        Product product = productFeign.getProduct(id);
        int result = 0;
        if (product != null) {
            Order order =
                    Order.builder().orderName("我购买的").orderMoney(new BigDecimal(1000)).productId(1).orderStatus(0).memberId(1001).build();
            result = orderDao.addOrder(order);
        }
        return result;
    }
}

六、Nacos命名空间和分组

6.1、命名空间:用于隔离每一个微服务的外部应用配置,每一个微服务都可以有自己单独的配置环境。默认新增的所有服务都在public空间(保留空间)。

 新建命名空间,每一个服务都可以创建一个命名空间

 6.2、配置分组:默认所有的配置都属于:DEFAULT_GROUP

每个微服务创建自己的命名空间,使用配置分组区分环境:开发环境dev,测试环境test以及生产环境prod等

创建分组:选择对应的命名空间,点击“+”创建分组配置

七、Nacos配置中心

Nacos配置中心类似于Spring Cloud Config的功能

Spring Cloud Config 使用git仓库存储配置文件,程序员自己创建config-server的服务器,把各个微服务作为客户端

Nacos 作为配置中心,配置的信息存储到服务端,就是Nacos。Nacos提供用于存储配置数据功能,为分布式系统中的配置数据提供服务器端和客户端支持,使用Spring Cloud Alibaba Nacos Config就可以在Nacos Server集中管理Spring Cloud应用的外部属性配置;

Spring Cloud Alibaba Nacos config是在启动的bootstrap阶段,将配置加载到Spring环境中;

通过bootstrap.properties(bootstrap.yml)启动我们的微服务

6.1、基于Nacos配置中心构建微服务应用

步骤:

1、pom文件中添加Nacos Config依赖

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

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

2、项目配置文件bootstrap.yml中

Spring Cloud Alibaba Nacos Config会根据命名空间、DataId、GROUP以及文件后缀名确定唯一一个配置

spring:
  cloud:
    nacos:
      config:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: dev-group
        file-extension: properties

  application:
    name: config-server

3、Nacos中添加外部配置文件

4、客户端通过nacos调用外部配置文件,拿到相应的属性值

@RestController
public class ConfigController {
    @Value("${user.info.username}")
    private String username;
    @Value("${user.info.password}")
    private String password;
    @GetMapping("/user/info")
    public String getUserInfo(){
        return username + ": " + password;
    }
}

八、基于profile多环境配置

nacos配置中心在加载配置的时候,不仅仅加载了以 dataid为 ${spring.application.name}.${file-extension:properties} 的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置;

在日常开发中如果遇到多套环境下的不同配置,可以通过Spring提供的 ${spring.profiles.active} 配置项来激活使用某个配置文件;

1、在Nacos中创建两个配置文件

 2、修改项目的配置文件bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: http://192.168.0.130:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: user-group
        file-extension: properties

  application:
    name: config-server
  profiles:
    active: dev

如果需要切换到测试环境,只需要更改 ${spring.profiles.active} 参数配置即可,如下所示:

spring.profiles.active=test

九、Nacos配置中心动态刷新

Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发org.springframework.cloud.context.refresh.ContextRefresher的refresh 方法;

可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新;

controller 加上以下注解

@RestController
@RefreshScope
public class ConfigController {
    @Value("${user.info.username}")
    private String username;
    @Value("${user.info.password}")
    private String password;
    @GetMapping("/user/info")
    public String getUserInfo(){
        return username + ": " + password;
    }
}

十、Nacos数据持久化

参考网址:https://nacos.io/zh-cn/docs/deployment.html

Nacos默认情况下是采用apache derby内嵌数据库进行数据存储,在单机模式时可以使用nacos嵌入式数据库实现数据存储,但是derby数据库不方便观察数据存储的基本情况,从acos 0.7版本开始增加了支持mysql数据源能力;

具体操作步骤:

第一步:安装数据库,版本要求:5.6.5+;

第二步:初始化MySQL数据库(也就是生成对应的数据库和表),数据库初始化文件: nacos-mysql.sql,该文件可以在Nacos程序包下的 conf目录下获得

第三步:修改 conf/application.properties文件,增加支持MySQL数据源配置,添加(目前只支持mysql)数据源的url、用户名和密码

#*************** Config Module Related Configurations ***************#
    32    ### If use MySQL as datasource:
    33     spring.datasource.platform=mysql
    34    
    35    ### Count of DB:
    36     db.num=1
    37    
    38    ### Connect URL of DB:
    39     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=Asia/Shanghai
    40     db.user.0=root
    41     db.password.0=123456

第四步:然后启动nacos(还是单机启动),此时发现nacos所有嵌入式数据库的数据都写到了mysql;

十一、Nacos集群部署

具体配置步骤:

1、准备三个nacos,3个或3个以上Nacos节点才能构成集群;

2、在Nacos的conf目录下有一个cluster.conf.example,可以直接把example扩展名去掉来使用,也可以单独创建一个cluster.conf文件,然后在该文件中每行配置一个ip:port;

 端口号需要和对应nacos的文件application.properties中的端口号一致

3、按照上面nacos持久化的方式配置好数据持久化到MySQL,生产使用建议至少主备模式,或者采用高可用数据库

4、启动测试;

集群下客户端怎么连?

第一种:可以在单机的基础上加多个IP和端口中间用逗号隔开;

spring:
  cloud:
    nacos:
      config:
        server-addr: http://ip地址1:8848/nacos,http://IP地址2:8848/nacos,http://ip地址3:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: user-group
        file-extension: properties

  application:
    name: config-server
  profiles:
    active: dev

第二种:配合Nginx代理我们的Nacos集群,配置里就直接写Nginx的IP和端口即可;

 

有关Spring Cloud Alibaba组件之Nacos的更多相关文章

  1. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  2. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

  3. ruby - 如何使用( ruby ) Rack 中间件组件设置 cookie? - 2

    我正在为需要有条件地设置cookie的Rails应用编写Rack中间件组件。我目前正在尝试设置cookie。通过谷歌搜索,这似乎应该可行:classRackAppdefinitialize(app)@app=appenddefcall(env)@status,@headers,@response=@app.call(env)@response.set_cookie("foo",{:value=>"bar",:path=>"/",:expires=>Time.now+24*60*60})[@status,@headers,@response]endend它不会给出错误,但也不会设置coo

  4. ruby-on-rails - 哪些组件使 VIM 成为一个好的(伟大的)ruby 编辑器? - 2

    我正在linux机器上学习rubyonrails并磨练我的VIM技能(skillz?)。当我在使用C++的时候开始使用VIM时,我有一个friend有一个很棒的vimfiles文件夹,里面有很多东西可以开始使用。从头开始,vim很棒,但感觉它还可以做得更好。我目前有:vim-rubybufferexplorerxml-edit(虽然我目前没有它可以处理erb文件)我知道这只是一些更有经验的vim/ruby开发人员所拥有的东西的皮毛(包括vim.rc文件中的一次性)。在某个地方是否有一个列表(或者我们可以创建一个)使ruby​​(和rails)编程更有趣所需的一堆标准vim配置?是否有一

  5. 修改第三方UI组件库样式的四种方法 - 2

    前提:当我们要修改vant组件库中Tabbar图标大小的样式(原图标是字体图标,大小由font-size控制)。  字体图标字体大小由css变量(--van-tabbar-item-icon-size)控制, 1.插槽方法结论:当你想要自定义使用插槽时,插入自己的元素,那么可以直接在当前作用域直接修改元素的样式。自定义img{height:28px}传入图片,用height属性控制图片大小,达到与字体图标相同效果2.全局定义变量结论:全局定义一个变量,覆盖它默认变量的值定义变量缺点:全局修改。 :root{--van-tabbar-item-icon-size:30px!important;/

  6. 本地nacos启动失败,org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean ** - 2

    总结:nacos-2.x.x要使用mysql5.7.x项目使用若依3.1.0-cloud版本,因此要使用nacos-2.x.x的版本,下载并安装nacos后,配置application.properties里的ConfigModuleRelatedConfigurations模块,#***************ConfigModuleRelatedConfigurations***************####IfuseMySQLasdatasource: spring.datasource.platform=mysql###CountofDB: db.num=1###ConnectURL

  7. Zookeeper、Nacos、Dubbo、Kafka之间的关系 - 2

    1.Zookeeper  Zookeeper是 ApacheHadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高。  Zookeeper的功能主要是它的树形节点来实现的。当有数据变化的时候或者节点过期的时候,会通过事件触发通知对应的客户端数据变化了,然后客户端再请求zookeeper获取最新数据,采用push-pull来做数据更新。服务注册和消费信息直接存储在zk树形节点上,集群下采用过半机制保证服务节点间一致性。 2.Nacos  Nacos是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理。Nacos是Dub

  8. Vue学习笔记:Vue element-ui中table组件的使用----接入后端数据 - 2

    记个笔记以免遗忘,建议还是查看Element-UI提供的官方文档学习,自己摸索比较难受官方文档:Element-UI组件TableElement-UI官网提供了许多Table格式,这里以一个带有筛选器的表格为例表格的官网显示效果:直接将官方提供的示例代码贴入.vue文件中即可使用显示的数据是通过data()方法提供的假数据。方法见下:data(){return{tableData:[{date:'2016-05-02',name:'王小虎',address:'上海市普陀区金沙江路1518弄'},{date:'2016-05-04',name:'王小虎',address:'上海市普陀区金沙江路1

  9. uni-app制作一个左侧导航scroll-view组件,并和页面主体展示联动 - 2

    先给大家看看最终效果首先我们来定义数据data(){ return{ lsit:[ 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic118.nipic.com%2Ffile%2F20161216%2F24271963_122609717000_2.jpg&refer=http%3A%2F%2Fpic118.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1656923017&t=183ece148b13b64e9dd503afd1b15c91'

  10. javascript - Reactjs:如何在安装组件之前获取要加载的数据? - 2

    有些奇怪的事情发生了,我一直在阅读React文档,他们讨论了生命周期以及如何在渲染组件之前做一些事情。我正在尝试,但我尝试的一切都失败了,总是组件首先进行渲染,然后调用componenWillMount、..didMount等。在调用这些函数之后,渲染再次发生。我需要先加载数据以填充状态,因为我不希望初始状态为null,我希望它包含自初始呈现以来的数据。我正在使用Flux和Alt,这是Action@createActions(flux)classGetDealersActions{constructor(){this.generateActions('dealerDataSuccess

随机推荐