「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
1 前言
上一篇文章我们进行了ELK环境的具体配置,并且顺利的通过ELK清洗数据,存储到ES中。
那既然有了环境,项目自然也需要有。这期我们的主体是搭建分布式项目作为数据来源。
车辙用过的只有Dubbo和SpringCloud。鉴于SpringCloud的某些组件未来可能不再开源。所以决定使用阿里的SpringCloudAlibaba作为基石,Nacos作为服务发现和配置。
2 Nacos
2.1 安装Nacos
这边建议安装nacos2.0,相比于1.x,2.x主要新增了长连接,性能更加优异。并且Nacos还支持Dubbo Zookeeper的迁移。详情见官网: nacos官网
2.2 创建命名空间
安装完毕后,打开localhost:8848/nacos在实际项目中,至少会存在两个个环境:测试环境和生产环境。
基于这个原因,这边创建一个名叫dev的命名空间,当然企业项目中可能还会存在pre和prod的命名空间。
2.3 新建配置
在dev命名空间下,我们创建provider的配置。注意:和apollo类似,我们这边最好带上文件后缀名。
3 服务配置
3.1 添加父模块依赖
父模块添加依赖,使用cloud-alibaba:2.2.7.RELEASE这个最新版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 添加子模块依赖
<dependencies>
<!-- 服务配置pom-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringBoot Web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.3 添加配置文件
由于Nacos 环境配置不支持application.yml,因此我们需要在resources下面创建bootstrap.yml和bootstrap-dev.yml
3.3.1 bootstrap.yml
server:
port: 8081
spring:
application:
name: provider
profiles:
active: dev
3.3.2 bootstrap-dev.yml
spring:
cloud:
nacos:
config:
namespace: dceedfe4-0041-41c5-be76-ed4c3689634d #上面创建的dev的id
server-addr: 127.0.0.1:8848
file-extension: yaml
3.4 创建RestController
请注意!!!为了保证Nacos的动态更新,我们需要在Bean上面添加@RefreshScope注解。
所以为了减少工作量,尽量创建Config类用于减少配置。
@RestController
@RefreshScope
public class ProviderController {
@Value("${useLocalCache1}")
private String useLocalCache;
@GetMapping(value = "/get")
public String get() {
return useLocalCache;
}
}
3.5 实践
初次调用:
修改后进行调用,发现值被动态更新了
4 服务发现
4.1 服务生产者
4.1.1 添加依赖
# 服务发现pom
# 由于父pom已经添加了spring-cloud-alibaba,所以此处不必添加版本号
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.1.2 添加服务发现配置
spring:
cloud:
nacos:
discovery:
namespace: dceedfe4-0041-41c5-be76-ed4c3689634d
server-addr: 127.0.0.1:8848
4.1.4 添加生产者方法
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
log.info("我正在打印日志");
return "Hello Nacos Discovery " + string;
}
4.2 服务消费者
4.2.1 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2.2 添加服务发现配置
server:
port: 8082
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
namespace: dceedfe4-0041-41c5-be76-ed4c3689634d
server-addr: 127.0.0.1:8848
4.2.3 创建调用者方法
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
log.info("开始调用日志");
return restTemplate.getForObject("http://provider/echo/" + str, String.class);
}
4.3 调用
可以看到成功调用了生产者提供的服务
5 结尾
到这边,分布式项目算是初步搭建完成了。更多内容咱们下期见~