【Spring】Spring Cloud Alibaba 版本选择及项目搭建笔记

前言

最近重新接触了 Spring Cloud 项目,为此参考多篇官方文档重新搭建一次项目,主要实践:

  • 版本选择,包括 Spring Cloud Alibaba、Spring Cloud、Spring Boot
  • 项目集成 Nacos
  • 项目使用 Nacos + Feign + Loadbalancer 完成服务间调用
  • 项目集成 Sentinel

跟着文档实践后,重点理解:

  • 版本选择
  • 组件间的融合特点

项目Github

1. 版本选择

要了解版本怎么选,必然要搞清楚 Spring Cloud Alibaba、Spring Cloud、Spring Boot 这三者的关系:

填空题:

    <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 Cloud Alibaba 版本说明,受限于jdk版本,我们选 Spring Cloud Alibaba 2021.0.5,关联的Cloud版本为 2021.0.5.0。然后,参考 Spring Cloud 版本说明,关联的 Boot 版本 2.6.13

    <properties>
        <spring-boot.version>2.6.13</spring-boot.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
    </properties>

2. 集成 Nacos

参考 Nacos 官网

  • 准备中间件的服务端本质就是下载一个 release 包,部署到服务器上,能上控制台。跟后续的 Sentinel 思路一致。这里省略。

实现:

  • 引入starter
    <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>
  • 装配(用的是Spring Cloud的注解,体现出生态融合的特点)
@EnableDiscoveryClient
@SpringBootApplication
public class SoupMilkApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(SoupMilkApplication.class, args);
    }
}
  • 元数据支持
spring.application.name=nacos-milk-service
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=192.168.1.10:8848
spring.cloud.nacos.discovery.namespace=public

3. 服务间调用

普通的 Feign只是简化外部调用,真正配合nacos注册中心使用的话还需要一个负载均衡的依赖。
实现:

  • 引入starter
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
  • 装配
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SoupMilkApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(SoupMilkApplication.class, args);
    }
}
  • feign 关联 nacos 服务
@FeignClient("nacos-water-service")
public interface WaterClient {
    
    

    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);

}

4. 集成 Sentinel

参考 Sentinel官网 ,附上一个控制台启动命令

java -Dserver.port=9090  -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

踩了一个端口的坑,需要开放以下端口,才能上报资源情况(指定为被Sentinel保护的资源)

firewall-cmd --zone=public --add-port=8719/tcp --permanent

firewall-cmd --reload
  • 引入 starter
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  • 使用
@Service
public class TestService {
    
    

    @SentinelResource(value = "hello")
    public String sayHello(String name) {
    
    
        return "Hello, " + name;
    }
}
  • 元数据
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=192.168.1.10:9090

5. 测试

  • nacos 控制台(账号密码都为sentinel) http://192.168.1.10:8848/nacos/#/login
  • sentinel 控制台(账号密码都为sentinel)http://192.168.1.10:9090/
  • 测试url http://localhost:8080/echo/sss

调用测试url后,既可以在 sentinel 看到记录。配置限流策略也可以生效。

在这里插入图片描述

后记

Spring Cloud Alibaba 两个组件的接入方式都很相似,也很好理解。其中值得一提的是:

  • 在不改变 Spring Cloud 原生注解的情况下,完成了微服务组件的融合。(nacos注册中心)
@EnableDiscoveryClient
@SpringBootApplication
public class SoupMilkApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(SoupMilkApplication.class, args);
    }
}
  • 在不改变 Feign 注解的情况下,完成了微服务组件的融合。(nacos微服务调用)
@FeignClient("nacos-water-service")
public interface WaterClient {
    
    

    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);

}