跟我学:分布式链路跟踪之SpringCloudAlibaba+Nacos

1,504 阅读3分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

跟我学:分布式链路跟踪之ELK初搭建
跟我学:分布式链路跟踪之ELK日志实战

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的命名空间。 image.png

2.3 新建配置

在dev命名空间下,我们创建provider的配置。注意:和apollo类似,我们这边最好带上文件后缀名。

image.png

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 实践

初次调用: image.png

修改后进行调用,发现值被动态更新了 image.png

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 调用

可以看到成功调用了生产者提供的服务 image.png

5 结尾

到这边,分布式项目算是初步搭建完成了。更多内容咱们下期见~