Spring Cloud Alibaba 之Nacos

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 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的基本使用终于结束了。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇
|
4天前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
4天前
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
4天前
|
SpringCloudAlibaba Dubbo Java
【SpringCloud Alibaba系列】Dubbo基础入门篇
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
【SpringCloud Alibaba系列】Dubbo基础入门篇
|
19天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
177 13
Spring Cloud Alibaba:一站式微服务解决方案
|
4天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
135 0
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
220 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
27天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
32 6
|
27天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
47 5
|
27天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
36 5