Spring Cloud Alibaba 之Nacos

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: Nacos:替代Eureka做服务中心,替代Config做服务配置中心。下载地址解压后运行(需要jdk8+maven环境),访问,默认账号密码均为为nacos。

Spring Cloud Alibaba 之Nacos


背景

出现的原因,替代一些已经不再维护的一些项目:

f9e718608134f7dea6de7a21bee41c2e.png


Nacos下载与安装

Nacos:替代Eureka做服务中心,替代Config做服务配置中心。下载地址

解压后运行(需要jdk8+maven环境),访问,默认账号密码均为为nacos。

1ebc208e6d4d5f5a4e4e10cda720ddcc.png


创建服务提供者

然后创建服务提供者的项目,入驻到nacos,相关配置如下:

首先在父工程引入依赖:

      <!--spring cloud alibaba 2.1.0.RELEASE-->
      <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>


然后在当前项目的pom里引入:

        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>


然后在yml里配置服务名与nacos地址:

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


最后在启动类加上@EnableDiscoveryClient注解即可。


随便编写个接口,然后启动项目:

package com.atguigu.springcloud.alibaba.controller;
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;
/**
 * @author baikunlong
 * @date 2020/12/17 18:32
 */
@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;
    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + serverPort + "\t id" + id;
    }
}


进入nacos的服务列表查看,可以看到服务已经进来了:

54786fe75950a9176af9d215bfdeac3a.png


nacos是默认有负载均衡的,因为它默认整合了ribbon:

e7218d3541c73f03cb4678f56a380987.png


所以为了测试负载均衡,接下来再创建一个9002的服务,直接复制9001改改端口即可(练习还是用这个,后面个方法调试用用就行)。也可以使用虚拟端口映射的方式:

35bcfa4377f25b6a1dab5d89e82e0919.png

3bc37dfbf9afedf42fe843647d756e83.png


启动9002服务后,可以看到服务已经入驻成功了:

bac2e33f41c547372c2870c3438d1bf9.png


使用端口进行访问,可以看到均能成功访问:

92d8222d72fe5dbdf2b0113f56eb6f20.png


创建服务消费者

pom和上面的提供者一样,yml里改个端口和加个自定义的访问服务名:

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#自定义的消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider


然后配置写个配置类,生成远程调用需要用到的RestTemplate实例,注意这里一定加@LoadBalance注解,因为用的ribbon:

package com.atguigu.springcloud.alibaba.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
 * @author baikunlong
 * @date 2020/12/17 20:12
 */
@Configuration
public class ApplicationContextConfig {
    @Bean
    //使用ribbon必须加该注解,否则报错找不到服务名
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}


控制器代码如下:

package com.atguigu.springcloud.alibaba.controller;
import lombok.extern.slf4j.Slf4j;
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;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
 * @author baikunlong
 * @date 2020/12/17 20:11
 */
@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;
    @Value("${service-url.nacos-user-service}")
    private String serverURL;
    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }
}


然后启动项目,可以看到消费者服务也入驻了:

2860ec7e8df9b184805c6c7efb22edae.png


然后访问测试负载均衡也没问题:

d3ce03d2090b81c7704f31328e245f43.png


Nacos配置中心

首先在配置管理下添加一个配置,Data ID命名规范下面再说:

183ec05cd814b4e4860f95cc9164f1df.png


然后创建一个module,pom里引入config这个依赖

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


然后在application.yml里配置当前激活的配置文件:

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


创建bootstrap.yml文件(该文件的级别比application.yml高,优先加载):

# nacos配置
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: yaml #指定yaml格式的配置(nacos配置那边是yaml后缀,不是yml)


到这里就能解释上面的Data ID配置规范了:s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}-spring.application.name−{spring.profile.active}.${spring.cloud.nacos.config.file-extension}

然后编写启动类,记得@EnableDiscoveryClient注解,然后写个控制器测试下是否能从配置中心获取配置:

package com.atguigu.springcloud.alibaba.controller;
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;
/**
 * @author baikunlong
 * @date 2020/12/18 10:56
 */
@RestController
@RefreshScope //支持Nacos的动态刷新功能。
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}


到这里访问http://localhost:3377/config/info 就能成功看到返回信息了,在控制器这里加了@RefreshScope,nacos默认就有了动态刷新功能,不用像Spring Cloud Config那样各种配置然后还要手动访问地址刷新,在这里测试下nacos的动态刷新:

a1bdd9199327993355e07a57bdf0a2db.png

可以看到在更改配置后,打开新窗口访问马上就刷新了。

到这里,Nacos已经完成了Eureka注册中心和Config配置中心的功能,接下来看看它还有什么更好用的东西。

nacos有着分组和命名空间的功能:namespace>group>data id,在配置页配置一下做个测试:

5beb27dedd7e7918fa103c404e6ffbaa.png


yml配置文件里增加代码:

9673baf84802f286407876a0e9d2757f.png


访问看看可以看到访问成功:

bf47efca66c930e140b13a62d586499a.png


接下来就是更改数据库了:

e5a01e80530df2f8d493ebffa6d831bc.png


首先就是创建nacos_config数据库,执行nacos-mysql.sql脚本,然后在application.properties里添加:

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest #记得改成你的用户名
db.password=youdontknow #记得改成你的密码


nacos官网:https://nacos.io/zh-cn/docs/deployment.html

因为我用的mysql8.x,1.1.4的nacos启动报错,虽然有修改版,但是官网有新版已经解决了,所以这里更新下nacos的版本为1.4.0:https://github.com/alibaba/nacos/releases/tag/1.4.0 ,然后要更改一下启动模式,否则会报错,默认是cluster集群模式,我们这里暂时用单机模式启动。

14d8283b05a50f24d146b8074e731169.png


然后可以看到,现在的数据是使用mysql进行存储了:

0cb4c0d956bdb82606a7112fe76a4b1a.png


以上均为windows操作,接下来全是在linux上操作。

到这里单机版的nacos就搭建完毕,接下来准备搭建集群版,使用linux版:

621f5c63bcd40fccd467382368c92ef7.png

e29fa762f14d59b7446e634546483fa9.png

bc9f2fd1a6de1edd3337eb96dda38ede.png


集群版开始使用老版本了,因为1.4.0的版本真的折腾了很久,各种报错心态崩了,mysql也是安装的5.7版本,记得创建数据库和执行sql。

下载地址:https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz

下载速度过慢可以用加速试试:https://toolwa.com/github/

下载好后进行解压:tar -zxvf nacos-server-1.1.4.tar.gz

1.修改conf下的application.properties,在最后添加如下代码

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=123456


2.在conf下创建cluster.conf,内容为集群的节点地址:

   192.168.5.128:3333
   192.168.5.128:4444
   192.168.5.128:5555


3.修改bin下的startup.sh

af25c1f48ff3fa09712683a68b863812.png


65818e89c2e1b07cf1ecf75ce8d07003.png


到这里修改完毕,可以启动了:

./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
tail -f -n +0 /mynacos/logs/start.out #查看日志


接下来配置nginx:

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
    upstream cluster{
        server 127.0.0.1:3333;
        server 127.0.0.1:4444;
        server 127.0.0.1:5555;
    }
    server {
        listen 1111;
        server_name localhost;
        location / {
            proxy_pass http://cluster;
        }
    }
}


然后启动nginx(我的是yum安装的默认目录):/usr/sbin/nginx -c /etc/nginx/nginx.conf


然后访问可以看到终于成功了:

54aea7a198c771585efc911b4d6a383b.png


然后启动9001项目,可以看到服务已经注册进去了:

1ea7954df099505ea9de6c7acf72117a.png


创建一个配置,可以看到数据库里直接插入成功了。

523219caea27eb6021ee6408acfe70ea.png


到这里nacos的基本使用终于结束了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
2月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
134 0
|
22天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
2月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
594 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
2月前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
37 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
22天前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
8天前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
17 0
|
2月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
2月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
下一篇
无影云桌面