一、组件介绍

        组件

 作用

nacos

注册中心(服务注册与发现)、配置中心(动态配置管理)

Loadbalancer 

负载均衡

Feign

声明式Http客户端(调用远程服务)

Sentinel

服务容错(限流、降级、熔断)

Gateway

API网关(webflux编程模式)

Sleuth

调用链监控

Seata

分布式事务解决方案


二、在公共模块引入依赖

1、每个微服务项目都会有个公共的模块,用于引一些公用的依赖、配置
2、引入这个依赖,spring-cloud-alibaba 其他的依赖就不用写版本号
3、注意版本号要与springboot版本对应

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

三、 Nacos
 

Nacos:注册中心,致力于帮助您发现、配置和管理微服务;

历史版本:https://github.com/alibaba/nacos/releases 

安装:

  • 从历史版本中下载 Zip 包,解压到本地即可使用;

运行:   

  • Windows
  • 在安装好的nacos下的bin目录下,打开cmd
  • startup.cmd -m standalone ---- 开启服务,默认为集群方式启动,启动报错,需改为单机版方式 standalone;
  • shutdown.cmd ---- 关闭服务;
  • Linux
  • cd /usr/nacos/bin
  • sh startup.sh -m standalone ---- 开启服务,standalone 单机运行模式;
  • bash startup.sh -m standalone ---- Ubuntu 开启服务;
  • sh shutdown.sh ---- 关闭服务

springcloud alibaba核心组件和dubbo核心组件代码对比 springcloud alibaba 组件_开发语言

  • 访问主页:http://127.0.0.1:8848/nacos/
  • 用户名/密码:nacos/nacos;

四、Feign

Feign远程调用工具

  • Pom 依赖
<!-- openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- loadbalancer, spring cloud 高版本中, OpenFeign 使用的负载均衡器,需单独引入 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
  • 配置
  • 启动类添加 @EnableFeignClients 注解;
  • 应用

        在需要调用的地方创建一个service接口

        加上@FeignClient注解,并将name属性配置为在nacos中心注册的要调用的其他微服务对应的名字

        将要调用的微服务的controller层的代码拷贝过来,去掉实现与public,给上完整的路径地址

springcloud alibaba核心组件和dubbo核心组件代码对比 springcloud alibaba 组件_java_02


五、Loadbalancer 负载均衡

我理解的是在注册中心中有多个相同名字的微服务(端口不一样),在默认调用时,采用轮循的方式调用每一个同名的微服务

例如下方alibaba-service-test有三个,端口分别为8001,8002,8003;当调用alibaba-service-test接口时会采用轮询的方式调用三个接口

springcloud alibaba核心组件和dubbo核心组件代码对比 springcloud alibaba 组件_微服务_03

我们可以修改这种调用方式,修改为随机调用三个端口

  • Service Module Account
  • Pom 依赖
  • 上一步已引入;
<!-- loadbalancer, spring cloud 高版本中, OpenFeign 使用的负载均衡器,需单独引入 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
  • 配置
  • CustomLoadBalancerConfig
package com.sfac.alibabaServiceAccount.config;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;


/**
 * Description: Custom LoadBalancer Config
 * - 该类不添加 @configuration 注解,因为该类为 @LoadBalancerClient 的属性准备
 * @author HymanHu
 * @date 2022-03-05 15:55:55
 */
public class CustomLoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
            Environment environment, 
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 在此也可返回自定义负载均衡器
        return new RandomLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}
  • 启动类添加 @LoadBalancerClient 注解;
@LoadBalancerClient(name = "alibaba-service-test", configuration = CustomLoadBalancerConfig.class)

当再一次调用alibaba-service-test时可以发现是随机调用三个接口。


五、Gateway网关

Gateway

  • Pom 依赖
<!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

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

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

        <!-- loadbalancer -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
  • application.properties
# for server
server.port=8888

# for nacos application
spring.application.name=spring-cloud-alibaba-gateway

# for not web start
spring.main.web-application-type=reactive

#for nacos discovery
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

# for gateway route
spring.cloud.gateway.routes[0].id=testServer
spring.cloud.gateway.routes[0].uri=lb://spring-cloud-alibaba-test
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/test/**
spring.cloud.gateway.routes[1].id=accountServer
spring.cloud.gateway.routes[1].uri=lb://spring-cloud-alibaba-account
spring.cloud.gateway.routes[1].predicates[0]=Path=/api/account/**
  • 启动类
package com.sfac.springCloudAlibabaGateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class SpringCloudAlibabaGatewayApplication {

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

}

测试:

        可以通过网关的端口来访问对应的接口