分布式组件SpringCloud Alibaba搭建

1.SpringCloud Alibaba简介

1)简介

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。该项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

2)为什么使用

1.SpringCloud的几大痛点:

  • SpringCloud部分组件停止维护和更新,给开发带来不便;
  • SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制;
  • SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用;

2.SpringCloud Alibaba的优势:

阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低。

  • SpringCloud Alibaba- Nacos:注册中心(服务发现/注册)
  • SpringCloud Alibaba . Nacos:配置中心(动态配置管理)
  • SpringCloud- Ribbon:负载均衡
  • SpringCloud- Feign:声明式HTTP客户端(调用远程服务)
  • SpringCloud Alibaba- Senfinel:服务容错(限流、降级、熔断)
  • SpringCloud- Gateway: API 网关(webflux 编程模式)
  • SpringCloud- Sleuth:调用链监控
  • SpringCloud Alibaba-Seata:原Fescar, 即分布式事务解决方案

2.SpringCloud Alibaba- Nacos:注册中心


三步完成Nacos Discovery搭建

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_后端

1)公共common模块pom文件引入spring-cloud-starter-alibaba-nacos-discovery

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

    </dependencies>

    <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>
        </dependencies>
    </dependencyManagement>

2)每个微服务的yml文件增加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: firstcloud-product

3)每个微服务启动类加上@EnableDiscoveryClient

@MapperScan("com.ynking.firstcloud.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class FirstcloudProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(FirstcloudProductApplication.class, args);
    }
}

下载Download Nacos Server download page并启动

再启动各个微服务。

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_spring_02


在浏览器输入http://127.0.0.1:8848/nacos

账号:nacos

密码:nacos

登录可看到自己刚刚启动的微服务

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_分布式_03

4)SpringCloud-OpenFeign测试远程调用

先引入:

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

现已经配置好两个微服务模块:ware模块,product模块
测试ware模块调用product模块
现product模块有接口:

@RestController
@RequestMapping("product/pmsattrattrgrouprelation")
public class PmsAttrAttrgroupRelationController {
    /**
     * 测试feign
     * @return
     */
    @RequestMapping("/getMsg")
    public R getMsg(){
        return R.ok().put("productMsg", "this is productMsg");
    }
}

1.ware模块启动类增加注解:
@EnableFeignClients(basePackages = “com.ynking.firstcloud.ware.feign”)
其中“com.ynking.firstcloud.ware.feign”为feign所在的包名

@MapperScan("com.ynking.firstcloud.ware.dao")
@EnableFeignClients(basePackages = "com.ynking.firstcloud.ware.feign")
@SpringBootApplication
@EnableDiscoveryClient
public class FirstcloudWareApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstcloudWareApplication.class, args);
    }

}

2.增加包专门放Feign的包:com.ynking.firstcloud.ware.feign
包下增加FeginService

/**
 * 这是一个声明式的远程调用
 */
@FeignClient("firstcloud-product")//“firstcloud-product”为要调用的微服务名称
public interface ProductFeignService {

    @RequestMapping("/product/pmsattrattrgrouprelation/getMsg")//路径要写全
    public R getMsg();

}

3.Controller调用:

@RestController
@RequestMapping("ware")
public class TestController {

    @Resource
    ProductFeignService productFeignService;

    /**
     * 测试远程调用
     * @return
     */
    @RequestMapping("/getFeignMsg")
    public R getFeignMsg(){
        R msg = productFeignService.getMsg();
        return R.ok().put("ware", "this is ware").put("FeignMsg",msg);
    }

}

调用过程和项目结构如下图所示:

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_java_04


调用ware接口即可看到product模块返回的数据。

5)SpringCloud Alibaba-Nacos配置中心


SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_分布式_05


1.首先,修改 pom.xml 文件,引入 Nacos Config Starter。

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

2.在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据

spring.application.name=firstcloud-product
 spring.cloud.nacos.config.server-addr=127.0.0.1:8848

3.完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能

@RefreshScope //打开动态刷新功能
 class SampleController {

 	@Value("${curuser.name}")
 	String userName;
 	
 }

配置中心配置方法:

先启动nacos Server,浏览器输入地址:

http://127.0.0.1:8848/nacos

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_spring_06


项目结构如下图:

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_可视化_07


4命名空间,分组,加载多配置集:

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_可视化_08


命名空间可以根据环境来分,也可以根据微服务来分。

每个微服务的bootstrap.properties 配置文件:

#只能匹配:应用名.properties文件
spring.cloud.nacos.config.namespace=196acffb-17c8-4b70-bc5d-86a273bfa13d
spring.cloud.nacos.config.group=1111

#可以匹配:任意.yml文件
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=618
spring.cloud.nacos.config.extension-configs[0].refresh=true

spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=618
spring.cloud.nacos.config.extension-configs[1].refresh=true

其中refresh=true代表自动刷新
这样就可以二维地选择对应的配置中心的文件了,还可根据配置文件的功能分多个配置文件。

6)SpringCloud-Gateway-API网关

1.新建一个gateway微服务

注意选中Gateway

SpringCloud alibaba汇总五大组件 springcloud alibaba 组件_分布式_09


引入“注册发现”,“配置中心”

或者引入之前的公共common模块,公共common模块中引入各个微服务需要的组件

<!--        服务注册/发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--        配置中心来做配置管理-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.增加配置文件
配置应用:注册中心地址,应用名,端口号
application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: firstcloud-gateway
server:
  port: 88

配置配置中心:应用名,配置中心地址
bootstrap.properties

spring.application.name=firstcloud-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

#指向配置中心firstcloud-gateway.yml文件
spring.cloud.nacos.config.namespace=acd1d029-d323-4c46-9f39-b7af6242c3da
#spring.cloud.nacos.config.group=dev

spring.cloud.nacos.config.extension-configs[0].data-id=firstcloud-gateway.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true

因为上步配置了配置中心的文件,所以可以在配置中心firstcloud-gateway.yml文件编写路由配置,也可以在本地应用application.yml文件中配置:

spring:
  cloud:
    gateway:
      routes:
        - id: query_route
          uri: https://www.qq.com
          predicates:
            - Query=url, qq

4.启动类加上@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
其中exclude = {DataSourceAutoConfiguration.class}是除去数据库有关的配置

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class FirstcloudGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstcloudGatewayApplication.class, args);
    }

}