2.服务发现
源码:https://gitee.com/myha/spring-cloud-study-demo/tree/master/nacos
2.1父工程
新建一个名为nacos的父工程,pom文件如下
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<spring.boot.version>2.6.3</spring.boot.version>
<spring.cloud.version>2021.0.1</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
</properties>
<!--包含两个子模块,服务提供方和服务消费方-->
<modules>
<module>nacos-service-provider</module>
<module>nacos-service-consumer</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
这里需要注意的是 Spring Boot、 Spring Cloud 、 Spring Cloud Alibaba 版本对应关系,具体可以参考:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
2.2服务提供方 (Provider)
2.2.1引入依赖
<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-discovery</artifactId>
</dependency>
</dependencies>
2.2.2配置
spring:
application:
name: demo-service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8006
2.2.3对外接口
编写一个对外接口/echo,代码如下
@EnableDiscoveryClient
@SpringBootApplication
public class NacosServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosServiceProviderApplication.class, args);
}
@RestController
static class TestController {
@GetMapping("/echo")
public String echo(String name) {
return "provider:" + name;
}
}
}
@EnableDiscoveryClient 注解可以用在 Spring Boot 应用的启动类上,表示该应用是一个服务提供者或者服务消费者,并且需要通过注册中心进行服务发现。当应用启动时,该注解会自动注册该应用到注册中心,并且从注册中心获取其他服务的信息。
其实nacos可以不使用这个注解, 在 Nacos 中,可以直接使用 Nacos 提供的 Java SDK 或者 REST API 来进行服务注册和发现。
启动一下程序
我们也可以打开访问http://127.0.0.1:8848/nacos,
说明服务已经注册到nacos中
2.3服务消费方 (Consumer)
2.3.1引入依赖
<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-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
2.3.2配置
spring:
application:
name: demo-service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8007
2.3.3消费接口
最后写一个接口调用服务方提供的接口
@SpringBootApplication
public class NacosServiceConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosServiceConsumerApplication.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@GetMapping("/echo")
public String echo(String str) {
return restTemplate.getForObject("http://demo-service-provider/echo?name=" + str, String.class);
}
}
}
@LoadBalanced 是 Spring Cloud 中的一个注解,用于启用负载均衡功能。负载均衡是指将请求分发到多个服务实例中,以达到提高系统可用性和性能的目的。
在 Spring Cloud 中,可以通过 RestTemplate 或者 WebClient 来进行服务调用。使用 @LoadBalanced 注解,可以让 RestTemplate 或者 WebClient 具备负载均衡的能力,从而根据负载均衡算法自动选择服务实例进行调用。
在浏览器中访问http://localhost:8007/echo?str=success
最后浏览器中打印 ” provider:success “
3.配置中心
新建一个名为nacos-service-config的子工程
nacos父工程pom文件需要引进改子模块
<modules>
<module>nacos-service-provider</module>
<module>nacos-service-consumer</module>
<!--配置中心子模块-->
<module>nacos-service-config</module>
</modules>
3.1引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--识别名为bootstrap配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
3.2配置
新建一个名字为bootstrap.yaml的配置文件,内容如下
spring:
application:
name: demo-service-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
server:
port: 8008
说明:之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
由此可以知道我们的dataId就是demo-service-config.yaml
那我们登录http://127.0.0.1:8848/nacos,创建一个名为demo-service-config.yaml的配置
内置内容如下
3.3测试例子
@SpringBootApplication
public class NacosServiceConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosServiceConfigApplication.class, args);
}
@RestController
public class TestController {
@Value("${username}")
private String username;
//获取配置的username的值
@GetMapping("/echo")
public String echo() {
return username;
}
}
}
打开浏览器访问:http://localhost:8008/echo
最后打印出“test”,说明获取nacos的配置成功