Spring Cloud Alibaba 之Nacos

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 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
目录
相关文章
|
18天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
128 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
1月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
25天前
|
消息中间件 自然语言处理 Java
知识科普:Spring Cloud Alibaba基本介绍
知识科普:Spring Cloud Alibaba基本介绍
56 2
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
阿里云开源 Spring AI Alibaba,旨在帮助 Java 开发者快速构建 AI 应用,共同构建物理新世界。
|
1月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
2月前
|
人工智能 前端开发 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”即可获取源码。 🎯主要目标:
93 0
|
1月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
61 0