nacos具备配置管理和服务注册发现的功能,官方建议是只在内网部署nacos服务,不要将其暴露到公网上。本篇我们讲一下如何在spring cloud应用中使用nacos的配置管理和服务注册发现的功能,在执行本文的各个操作前,请确保本地的nacos服务已正常启动。
本篇涉及到应用系统的pom文件的基本内容如下:
<?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>com.xk</groupId>
<artifactId>springcloud-nacos-provider</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--mybatis启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--lombok包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<!--版本关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
后面在系统中添加依赖,默认pom文件已包含如上的内容。
1、开启nacos配置管理功能
本部分我们讲一下spring cloud应用如何集成nacos来读取维护在nacos上面的配置数据。首先我们先创建一个普通的spring boot应用。
1.1 、引入nacos配置管理依赖
在系统的pom文件中添加如下内容:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.2、修改配置文件
和spring cloud集成的时候,nacos配置中心的配置项只能放到bootstrap.yml(或bootstrap.properties)中。在resources下的bootstrap.yml中添加如下的配置:
spring:
application:
name: provider
cloud:
nacos:
#配置中心
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
#命名空间对应的id,如果是在public空间,可以不配置此项
namespace: c91a7f69-cefc-4ee3-8350-07ab87affd05
在nacos-spring-cloud中,nacos配置管理中的dataId的命名规则如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
当通过配置文件来指定spring.profiles.active时,spring.profiles.active必须放在 bootstrap.properties 文件中。而且spring.profiles.active 为空时,dataId格式中对应的连接符 -
也将不存在,dataId 的拼接格式就变成 :
${prefix}.${file-extension}
file-exetension为配置内容的数据格式,默认为properties,可以通过配置项 spring.cloud.nacos.config.file-extension来配置。目前只支持 properties和 yaml 类型。
以上我们的配置就是告诉nacos客户端,启动的时候去nacos上面读取dev命名空间下,group为DEFAULT_GROUP,并且dataId为provider.yaml的配置集的内容。
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataId 为 ${prefix}.${file-extension:properties} 为前缀的基础配置,还加载了dataId为 ${prefix}-${profile}.${file-extension:properties}的基础配置
1.3、新建nacos配置集
登录nacos服务,在配置管理列表选择dev命名空间(如果还没有dev命名空间,可以去命名空间下面创建),然后新建配置,dataId为provider.yaml,group使用默认的组,配置格式选择yaml,配置内容如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8
username: root
password: zdan
1.4、验证结果
因为我们的pom文件引入了mybatis的启动器配置,系统启动过程中会自动读取数据源配置,然后创建DataSource对象。如果系统能启动成功,就说明从nacos服务上读到了数据源的配置信息。启动我们的应用,发现打印了下面的日志,说明我们的配置是成功的。
2023-05-17 09:15:01.445 WARN 9560 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[provider] & group[DEFAULT_GROUP]
2023-05-17 09:15:01.467 INFO 9560 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-provider.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-provider,DEFAULT_GROUP'}]
2023-05-17 09:15:01.476 INFO 9560 --- [ main] com.xk.nacos.springcloud.App : No active profile set, falling back to 1 default profile: "default"
2023-05-17 09:15:02.315 INFO 9560 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=838d775a-2a94-3625-a774-7acc513cf749
2023-05-17 09:15:02.687 INFO 9560 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http)
2023-05-17 09:15:02.698 INFO 9560 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-05-17 09:15:02.698 INFO 9560 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2023-05-17 09:15:02.891 INFO 9560 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-05-17 09:15:02.891 INFO 9560 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1397 ms
2023-05-17 09:15:03.072 INFO 9560 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2023-05-17 09:15:03.219 INFO 9560 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
2023-05-17 09:15:05.050 INFO 9560 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path ''
2023-05-17 09:15:05.974 INFO 9560 --- [ main] com.xk.nacos.springcloud.App : Started App in 11.828 seconds (JVM running for 13.889)
2023-05-17 09:15:05.990 INFO 9560 --- [ main] c.a.c.n.refresh.NacosContextRefresher : [Nacos Config] Listening config: dataId=provider, group=DEFAULT_GROUP
2023-05-17 09:15:05.994 INFO 9560 --- [ main] c.a.c.n.refresh.NacosContextRefresher : [Nacos Config] Listening config: dataId=provider.yaml, group=DEFAULT_GROUP
2、开启nacos服务发现和注册功能
本部分我们创建两个spring cloud应用,来演示如何将服务信息注册到nacos,以及其他应用如何从nacos上面读取服务配置信息。
2.1、创建服务提供者
我们将第1部分创建的应用作为一个服务提供者,将它的信息注册到nacos上面。
2.1.1、引入nacos服务注册和发现依赖
首先在pom.xml中新增如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.1.2、修改配置文件
在工程的resources资源目录下创建application.yml文件,并添加如下内容:
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
由于bootstrap.yml中已经配置了spring.application.name,因此这里就不再配置它了。当然,此处也可以不创建application.yml文件,可以直接将此处的配置写到bootstrap.yml文件中。
2.1.3、新增接口
在controller层创建ProviderController文件,内容如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@GetMapping("hello")
public String hello(){
return "hello,2023";
}
}
2.1.4、修改启动类
我们在启动类上面添加@EnableDiscoveryClient注解,内容如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
2.1.5、启动服务
将启动类App启动,我们的服务信息就注册到nacos上面了。我们通过浏览器进入nacos服务管理页面,可以发现服务列表中多个一条服务的记录:
其中服务名就是我们应用里面配置的spring.application.name的值。
点击服务详情,可以看到这个服务下面所有的ip和端口号。假如我们搭了一个由3台机器组成的集群,那么在这下面就能看到三条记录。
2.2、创建服务消费者
我们新增一个spring boot应用,应用内部通过服务名的方式去调用服务提供者的接口,底层会通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务的ip和端口信息。
2.2.1、引入nacos服务注册和发现依赖
首先在pom.xml中新增如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡组件,用于将我们引用的服务转换成真实的ip和端口-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2.2.2、修改配置文件
在工程的resources资源目录下创建application.yml文件,并添加如下内容:
server:
port: 8080
spring:
application:
name: consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
注意,本项目不需要创建bootstrap.yml文件,服务发现的配置直接写到application.yml(或application.properties)文件就可以了
2.2.3、新增接口
新建BeanConfig配置类,内容如下:
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 xk
* @since 2023.05.17 8:16
*/
@Configuration
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在controller层创建ConsumerController文件,内容如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("hello")
public String hello(){
//此处直接写服务名称provider,不需要指定端口号
return result = restTemplate.getForObject("http://provider/hello",String.class);
}
}
2.2.4、修改启动类
我们在启动类上面添加@EnableDiscoveryClient注解,内容如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@EnableDiscoveryClient注解默认会将我们当前的应用信息注册到nacos服务列表,如果我们不想注册我们的服务,可以配置该注解的属性如下:
@EnableDiscoveryClient(autoRegister = false)
2.2.5、启动服务
将启动类App启动,然后浏览器访问如下路径:
http://127.0.0.1:8080/hello
可以看到,浏览器得到了如下的响应:
hello,2023
说明服务注册和发现功能正常。
结束语
觉得有收获的朋友,可以点击关注我,这样方便接收我后续的文章,多谢支持~
原文始发于微信公众号(IT人的天地):spring cloud集成nacos,就是这么简单
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/186537.html