提示:以下是本篇文章正文内容,下面案例可供参考
聚合项目:由于聚合带来的诸多好处,在SpringBoot项目开发中也广泛采用,开发中将SpringBoot项目按照功能分成子模块开发,所以我们使用Sping Cloud Alibaba 完成项目的时候,也是采用聚合项目来完成的。
直接下一步依赖都不用勾选☑️:
父项目构建完成后,将src 目录删除掉
然后修改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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<!--TODO这个地方不能填 2.2.5.RELEASE ,版本之间不兼容的、需要注意⚠️ -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>SpringCloudAlibabaStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloudAlibabaStudy</name>
<packaging>pom</packaging>
<description>SpringCloudAlibabaStudy</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba-version>2.2.5.RELEASE</spring-cloud-alibaba-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>cloudalibaba-nacos-9001</module>
</modules>
</project>
# 将子模块项目的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>
<parent>
<groupId>com.example</groupId>
<artifactId>SpringCloudAlibabaStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>cloudalibaba-nacos-9001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloudalibaba-nacos-9001</name>
<description>cloudalibaba-nacos-9001</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.11</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
子模块的pom.xml配置完成✅后还需在父项目的pom.xml文件中添加
# 模块
<modules>
<module>cloudalibaba-nacos-9001</module>
</modules>
此时pm的配置已经完成了。
yml文件配置:
在子模块下创建一个application.yml文件内容如下:
server:
port: 9001
Spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8080 #这个地址是nacos的地址
management:
endpoint:
web:
exposure:
include: '*'
在子模块的启动项添加@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaNacos9001Application {
public static void main(String[] args) {
SpringApplication.run(CloudalibabaNacos9001Application.class, args);
}
}
<?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>
<parent>
<groupId>com.example</groupId>
<artifactId>SpringCloudAlibabaStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>cloudalibaba-consumer-nacos-8083</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloudalibaba-consumer-nacos-8083</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml文件内容
server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
nacos:
server-addr: loaclhost:8080
management:
endpoint:
web:
exposure:
include: '*'
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConsumerNacos8083Application {
public static void main(String[] args) {
SpringApplication.run(CloudalibabaConsumerNacos8083Application.class, args);
}
}
父项目pom.xml文件中models中将本模块添入
大家现在可能很疑惑,这个服务消费者不是要吊用具体的服务吗?但是现在仅仅是创建出来了,和上面的服务者也没有多大的区别?
是这样的,我们现在想要让这个服务的消费者去调用服务提供者,我面就需要通过Ribbon来进行调用,那么首先我们先来了解Ribbon。
他是一个居于HTTP和TCP客户端负载均衡器。他虽然只是一个工具库,他却是每一个微服务的基础设施,因为实际上,对于服务间调用、API网关请求转发都是需要经过Ribbon负载均衡来实现。总体来说,Ribbon的主要作用是:从注册服务器拿到对应服务列表后以负载均衡的方式访问对应服务。
何时使用Ribbon呢?一般情况下当一个模块需要从另外一个模块获取数据时就需要使用Ribbon的远程调用功能了。
要注意的是Nacos已经整合了Ribbon,所以我们想要使用只需要导入Sprng Cloud Alibaba Nacos的依赖就可以直接使用了。
RestTemplate封装了Ribbon调用的过程,其中getForObject是常用的方法,同时还哟啊在服务消费者中配置RestTemplate:
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
restTeamplate.getForObject(arg1,arg2,arg3...);
第一个参数URL表示被调用的目标Rest接口为止
现在知道了如果我们想要让服务消费者consumer-nacos-8083调用服务提供者nacos-9001或者 9002 ,那么必然要使用Ribbon,所以我面要做的第一件事情就是先让9001或者 9002 服务对外提供借口,用户访问。
内容如下:
@RestController
public class DemoController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/study")
public String getServerPort(){
return "Hello Nacos DisCovery "+serverPort;
}
}
在消费者的applicatin.yml文件中添加以下内容:
# 消费者将要去访问的微服务名称
service-url:
nacos-user-service: http://nacos-provider
启动类中输入RestTemplate对象
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConsumerNacos8083Application {
public static void main(String[] args) {
SpringApplication.run(CloudalibabaConsumerNacos8083Application.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
创建一个消费者接口在DemoController中
@RestController
public class DemoController {
#自动注入restTemplate对象
@Autowired
private RestTemplate restTemplate;
#读取配置文件中的配置信息
@Value("${service-url.nacos-user-service}")
private String serviceURL;
@GetMapping(value = "consumer/nacos")
public String getDiscovery(){
return restTemplate.getForObject(serviceURL+"/study",String.class);
}
}
测试结果:
访问:http://localhost:8080/cosumer/nacos
结果:Hello Nacos Discovery9001/9002
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>
<parent>
<groupId>com.example</groupId>
<artifactId>SpringCloudAlibabaStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>cloudalibaba-config-3377</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloudalibaba-config-3377</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
要注意的是这里我们要配置两个,因为Nacos同SpringCloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,boostarp优先级高于application
分别要配置的是,这里bootstrap.yml配置好了以后,作用是两个,第一让3377这个服务注册到Nacos中,第二个作用就是去Nacos中去读取指定后缀为yaml的配置文件:
bootstarp.yml
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格式的配置
application.yml
spring:
profiles:
active: dev
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConfig3377Application {
public static void main(String[] args) {
SpringApplication.run(CloudalibabaConfig3377Application.class, args);
}
}
这里的@RefreshScope 实现配置自动更新,意思为如果想要使配置文件中的配置修改后不用重启项目即生效,可以使用@RefieshScope配置来实现
@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getCOnfigInfo(){
return configInfo;
}
}
在Nacos Spring Cloud 中,dataId 的完整格式如下(详情可以参考官网https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html);
p r e f i x − {prefix}- prefix−{spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,注意:**当spring.profiles.active
为空时,对应连接的连接符-
也将不存在,dataId 的拼接格式成为${prefix}.${file-extension}
** (不能删除)file-extension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。当前只支持properties
和yaml
类型。- 通过 Spring Cloud 原生注解
@RefreshScope
实现配置自动更新;- 所以根据官方给出的规则我面最终需要在Nacos 配置中心添加的配置文件的名称规则和名字为:
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.profiles.active}.${file-extension}
Nacos-config-client-dev.yaml
微服务名称-当前环境-文件格式
config:
info: nacos config center,version = 1