一、组件介绍
组件 | 作用 |
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 ---- 关闭服务
- 访问主页: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,给上完整的路径地址
五、Loadbalancer 负载均衡
我理解的是在注册中心中有多个相同名字的微服务(端口不一样),在默认调用时,采用轮循的方式调用每一个同名的微服务
例如下方alibaba-service-test有三个,端口分别为8001,8002,8003;当调用alibaba-service-test接口时会采用轮询的方式调用三个接口
我们可以修改这种调用方式,修改为随机调用三个端口
- 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);
}
}
测试:
可以通过网关的端口来访问对应的接口