springcloud alibaba 整合流程

相关依赖

父工程pom相关依赖

<packaging>pom</packaging>

        <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-dependencies</artifactId>
                <version>2.0.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

pom和import的作用

当需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包。

子项目继承父项目后,直接在子pom中直接引入父pom相关的依赖即可。

子项目引入nacos依赖和web依赖

<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-config</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

spring-cloud-starter-alibaba-nacos-config 是获取nacos配置依赖

spring-cloud-starter-alibaba-nacos-discovery 是服务发现依赖

服务发现

新建两个子工程:service-a生产者和service-b消费者

service-a生产者 yml配置文件

server:
  port: 7070

spring:
  application:
    name: service-a
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

在springboot启动类上新增注解@EnableDiscoveryClient,暴露服务,连接到注册中心。

新建controller

@RestController
public class TestController {

    @GetMapping("/getData")
    public String getData(){
        return "success";
    }
}

service-b消费者

pom文件新增feign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

yml配置文件

server:
  port: 7071

spring:
  application:
    name: service-b
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        
feign:
  sentinel:
    enabled: true        

在springboot启动类上新增注解@EnableDiscoveryClient,暴露服务,连接到注册中心。

同时开启sentinel熔断功能。

新增@EnableFeignClients注解,支持调用消费者接口。

新建测试类

@RestController
public class TestController {

    @Autowired
    private ConsumerService consumerService;

    @GetMapping("/getData")
    public String getData() {
        String data = consumerService.getData();
        return "consumer consumer ---" + data;
    }
}

@FeignClient(value = "service-a", fallbackFactory = ConsumerServiceFallbackFactory.class)
interface ConsumerService {
    @RequestMapping(value = "/getData", method= RequestMethod.GET)
    String getDate();
}

@FeignClient(value = "service-a") 表示调用service-a服务下getData接口。

fallbackFactory = ConsumerServiceFallbackFactory.class 表示熔断异常时对应的异常处理类。

@Component
public class ConsumerServiceFallbackFactory implements FallbackFactory<HelloServiceFallback> {
    public HelloServiceFallback create(Throwable throwable) {
        return new HelloServiceFallback(throwable);
    }
}

public class HelloServiceFallback implements ConsumerService {
    private final Throwable throwable;
    HelloServiceFallback(Throwable throwable) {
        this.throwable = throwable;
    }
    public String getDate() {
        return "服务调用失败,降级处理。异常信息:" + throwable.getMessage();
    }
}

设置ribbon均衡负载

启动类加上

  @Bean
    public RandomRule createRule(){
        return new RandomRule();
    }

引入接口文档

父工程pom引入依赖

<dependency>
	<groupId>com.github.xiaoymin</groupId>
	<artifactId>knife4j-dependencies</artifactId>
	<version>2.0.2</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

子工程pom引入依赖

<dependency>
	<groupId>com.github.xiaoymin</groupId>
	<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

子工程新建配置类

@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {

    @Bean(value = "default")
    public Docket GitEggApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //分组名称
                .groupName("2.X版本")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.example.serviceb.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().version("1.0.0")
                .title("Spring Cloud Swagger2 文档")
                .description("Spring Cloud Swagger2 文档")
                .termsOfServiceUrl("www.xxxx.com")
                .build();
    }
}

访问服务地址:端口号/doc.html,即可访问。

nacos配置管理

pom文件添加依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在resources文件下,新建bootstrap.yml文件,新增配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: properties

${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-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

在nacos配置列表新增配置DataId为service-b.properties,配置内容为config.version=1。

记得加上注解,@RefreshScope,才能够刷新动态配置的值

@RestController
@RefreshScope
@Api(tags = "调用service-a控制器")
public class TestController {

    @Autowired
    private ConsumerService consumerService;
    @Value("${config.version}")
    private String version;

    @GetMapping("/getData")
    @ApiOperation(value = "调用service-a方法")
    public String getData() {
        String date = consumerService.getDate();
        return "consumer consumer ---" + date;
    }

    @GetMapping("/getConfig")
    @ApiOperation(value = "获取nacos动态配置参数")
    public String getConfig(){
        return version;
    }
}

访问接口文档地址,测试getConfig接口。

关于命名空间和分组

Namespace:解决多环境及多租户数据的隔离问题 在多套不同的环境下,可以根据指定的环境创建不同的Namespace,实现多环境的数据隔离。默认的命名空间是public。

Group:Nacos 中的一组配置集,是组织配置的维度之一,简单的说则是不同的系统 或微服务的配置文件可以放在一个组里。Nacos如果不指定Group,则默认的分组是 DEFAULT_GROUP。

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: properties
        # namespace的取值是命名空间ID,需要去nacos控制台查看
        namespace: d0ffeec2-3deb-4540-9664-fdd77461fd6b
	    # 指定分组为ORDER_GROUP
	    group: ORDER_GROUP

根据自己业务场景做好多环境配置隔离(Namespace)、不同业务配置隔离(Group)。

如果想要使用其他配置文件,添加yml配置。

service-a.properties是同一命名空间的配置文件。

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: properties
        namespace: 8ca6407f-fd47-4339-a121-1333e95e6c11
        group: ORDER_GROUP
        shared-configs:
          - dataId: service-a.properties
            refresh: true
		   group: DEFAULT_GROUP

OpenFeign设置

默认1秒超时时间,通过yml配置设置全局过期时间和指定服务超时时间。

feign:
  sentinel:
    enabled: true
  client:
    config:
      default:               # default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
        connectTimeout: 5000 # 建立链接所用的时间,适用于网络状况正常的情况下, 两端链接所用的时间
        readTimeout: 5000    # 建立链接后从服务器读取可用资源所用的时间
      service-a:			# 指定service-a的超时时间
        connectTimeout: 3000
        readTimeout: 2000

替换client为ApacheHttpClient

新增依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

yml新增配置

  feign:
  	httpclient:
    	enabled: true
posted @ 2021-11-25 16:36  dxyoung  阅读(257)  评论(0)    收藏  举报