本文章是nacos2服务注册发现入门级文章,重点介绍了如何安装部署nacos2,如何选择spring boot版本、spring cloud版本,如何开发spring boot服务,如何注册到naocs2中,如何使用RestTemplate和Feign调用服务。
一、验证环境
- Windows10 64位
- JDK1.8
- Nacos2.0.3
- Spring Boot 2.3.2.RELEASE
- Spring Cloud Alibaba 2.2.6.RELEAS
二、参考文档
Nacos官方文档:Nacos支持三种部署模式
Nacos开源地址:Releases · alibaba/nacos · GitHub
三、安装部署nacos
1、下载nacos
从Nacos官方网站下载nacos-2.0.3版本:
Releases · alibaba/nacos · GitHubhttps://github.com/alibaba/nacos/releases
下载完成后,解压即可
2
、配置数据库
nacos默认是使用嵌入式数据库实现数据的存储,如果我们要使用外部 mysql 存储 nacos数据,先在mysql里创建nacos数据库
创建完成后,导入mysql脚本,到安装目录conf/nacos-mysql.sql
找到脚本文件执行,完成mysql 数据库初始化。
注意,mysql5.6版本会报错:Specified key was too long; max key length is 767 bytes,原因是
mysql5.6最长的索引是767,要用Mysql5.7以上版本解决该问题。
修改 conf/application.properties
文件,添加 mysql
数据源的配置,然后重启,便可生效。
3
、启动nacos
双击 bin 目录下的 startup.cmd
启动服务器,在启动之前,先修改启动模式为standalone,即单机独立启动,非集群模式。
4
、访问nacos
通过浏览器访问 http://127.0.0.1:8848/nacos
打开 nacos 控制台登录页面,默认用户名密码皆为:nacos
,登录成功后便可访问主页面。
四、服务注册发现验证
1、springcloud+springboot版本选择
版本问题:开发代码需要注意springcloud、springboot、nacos 这些组件间版本依赖问题,具体看官方说明,版本不匹配可能会引起莫名其妙的问题,尽量使用官方推荐的版本。详细说明见官方wiki:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8Ehttps://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
本示例工程使用的版本为:
Spring Boot 2.3.2.RELEASE版本、 Spring Cloud Alibaba 2.2.6.RELEAS版本
2、服务注册发现架构描述
在微服务架构中,整个系统会按职责划分为多个服务,通过服务之间且做来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成这一次请求,消费方需要知道服务生产方的网络位置(IP地址和端口号)
本示例逻辑架构图:
示例工程结构如下:
开源代码地址:基于Nacos2+Spring Boot2的服务注册发现示例: 基于Nacos2+Spring Boot2的服务注册发现示例,可以直接运行。
3、springboot代码实现与服务注册发现验证
步骤1:新建父工程
Pom.xml如下:
<?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>org.example</groupId>
<artifactId>nacos-example</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>nacos-example</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
以上便是父工程的代码,其中关键点在于:引入 spring-cloud-starter-alibaba-nacos-discovery jar包、spring-cloud-starter-openfeign包、spring-boot-starter-web包;
步骤2:新建服务提供者service-provider
Pom.xml如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>nacos-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>nacos-example</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
如下:
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8070
注意:server-addr: 127.0.0.1:8848为Nacos服务地址,service-provider为该服务的名称,服务消费者要使用该名字。
启动类
如下:
package com.nacos.example.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
服务类
如下:
package com.nacos.example.provider.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/provider")
public class ProviderController {
@RequestMapping(value = "/echo", method = RequestMethod.GET)
public String echo() {
return "Hello Nacos Discovery 2021";
}
}
以上便是提供者的代码,其中关键点在于: 1. 在启动类标注 @EnableDiscoveryClient 注解 ;2. 在 application.yml 中配置nacos服务中心的地址; 3. 在 controller 中暴露服务。
步骤3:新建服务消费者service-consumer
Pom.xml如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>nacos-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<name>nacos-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>nacos-example</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
如下:
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8080
启动类
如下:
package com.nacos.example.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
服务类
如下:
package com.nacos.example.consumer.controller;
import com.nacos.example.consumer.server.ProviderFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
@RequestMapping("/api/consumer")
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ProviderFeignService providerFeignService;
@RequestMapping(value = "/echo1", method = RequestMethod.GET)
public String echo1() {
System.out.println("===========这是用restTemplate方式调用服务,带负载均衡。");
return restTemplate.getForObject("http://service-provider/api/provider/echo", String.class);
}
@RequestMapping(value = "/echo2", method = RequestMethod.GET)
public String echo2() {
System.out.println("===========这是用FeignClient方式调用服务,带负载均衡。");
return providerFeignService.echo();
}
}
Feign接口类如下:
package com.nacos.example.consumer.server;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient("service-provider")
public interface ProviderFeignService {
@RequestMapping(value = "/api/provider/echo", method = RequestMethod.GET)
String echo();
}
以上便是消费者的代码,其中关键点在于: 1. 在启动类标注 @EnableDiscoveryClient
注解; 2. 在 application.yml
中配置nacos
服务中心的地址; 3. 在 controller
中使用RestTemplate
调用服务;4. 编写Feign接口,在 controller
中使用FeignClient调用服务。
步骤4:服务注册验证
服务提供者启动,提示nacos registry, DEFAULT_GROUP service-provider 192.168.0.115:8070 register finished,表示服务注册成功。
服务消费者启动,提示nacos registry, DEFAULT_GROUP service-consumer 192.168.0.115:8080 register finished,表示服务注册成功。
登录nacos控制台http://127.0.0.1:8848/nacos
,查看服务列表,可以看到刚刚注册的服务。
步骤5:服务调用验证
访问地址:
http://127.0.0.1:8080/api/consumer/echo1
该请求是通过RestTemplate方式调用服务,代码如下:
访问地址:
http://127.0.0.1:8080/api/consumer/echo2
该请求是通过FeignClient方式调用服务,代码如下:
本示例开发参考了官方文档:Nacos Spring Cloud 快速开始Nacos Spring Cloud 快速开始https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
五、总结
云程低代码平台基于标准云原生架构开发,可以跟Nacos无缝集成,同时也支持与K8S、Rancher、阿里云平台、华为云平台等集成融合,欢迎访问官方体验站点:云程 | 云BPM,云程BPM,低代码平台,低代码开发平台,开源流程引擎,Camunda,flowable,业务流程管理,activiti,智能表单,电子表单,可视化开发,零代码开发,基础平台,流程PaaS,流程SaaS。