随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
以上是官网对sentinel的一个介绍,本篇文章不讲原理,只讲搭建和使用。官网:https://github.com/alibaba/Sentinel/
正式开始之前我们先来看一下sentinel提供的dashboard界面:
通过https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard 下载源码进行构建,由于是SpringBoot项目,打包后可以使用java -jar xxx.jar来启动,我这里已经构建好了,直接来看启动后的界面:
默认的用户名和密码都是 sentinel,
可以看到有sentinel-test的,这个是我们刚刚刚定义的。
可以看到,我刚刚对c1和c2的服务进行了访问,在这里可以查看接口的qps等。
由于我使用的集群总体,阀值为20,所以qps平均在21左右,集群内有2个机器,分别是c1和c2, Java的测试代码如下:
可以看到Blocked By Sentinel (flow limiting) 说明被拒绝了,有一个注意点就是在添加规则的时候要选择集群:
在添加流控规则的时候如果不勾选默认是单机的,不会走token-server
可以看到我当前的机器节点。 下面来说项目的搭建。
项目结构如上,c1和c2模仿了2个应用,token-server为集群提供token。
下面我们来看c1和c2的工程目录:
c2和c1的工程目录一样,为了方便截图,只展开C1工程。
c1、c2工程的pom配置如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
com.sentinel
c1
0.0.1-SNAPSHOT
c1
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.cloud
spring-cloud-starter-alibaba-sentinel
com.alibaba.csp
sentinel-transport-simple-http
1.7.0
com.alibaba.csp
sentinel-core
1.7.0
com.alibaba.csp
sentinel-datasource-extension
1.7.0
com.alibaba.csp
sentinel-cluster-client-default
1.7.0
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.cloud
spring-cloud-alibaba-dependencies
0.2.2.RELEASE
pom
import
org.springframework.boot
spring-boot-maven-plugin
application.properties配置如下
server.port=8700
spring.application.name=sentinel-test
spring.cloud.sentinel.eager=true
spring.cloud.sentinel.transport.dashboard=http://192.168.0.122:8080
C1Application.java、C2Application.java
package com.sentinel.c1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class C1Application {
public static void main(String[] args) {
System.setProperty("csp.sentinel.log.use.pid", "true");
SpringApplication.run(C1Application.class, args);
}
@RequestMapping(value = "hello")
public String hello(){
return "c1";
}
}
以上主要为C1和C2工程目录的主要配置文件和代码,接下来我们看看token-server的配置。
token-server的pom.xml配置
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
com.sentinel
token-server
0.0.1-SNAPSHOT
token-server
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
com.alibaba.csp
sentinel-core
1.7.0
com.alibaba.csp
sentinel-transport-simple-http
1.7.0
com.alibaba.csp
sentinel-cluster-server-default
1.7.0
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
org.springframework.boot
spring-boot-maven-plugin
TokenServerApplication.java
package com.sentinel.tokenserver;
import com.alibaba.csp.sentinel.cluster.server.ClusterTokenServer;
import com.alibaba.csp.sentinel.cluster.server.SentinelDefaultTokenServer;
import com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager;
import com.alibaba.csp.sentinel.cluster.server.config.ServerTransportConfig;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Collections;
@SpringBootApplication
public class TokenServerApplication {
public static void main(String[] args) throws Exception {
// SpringApplication.run(TokenServerApplication.class, args);
System.setProperty("project.name", "sentinel-test");
System.setProperty("csp.sentinel.dashboard.server", "http://192.168.0.122:8080");
System.setProperty("csp.sentinel.log.use.pid", "true");
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton("default"));
ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig().setPort(11111).setIdleSeconds(600));
// Not embedded mode by default (alone mode).
ClusterTokenServer tokenServer = new SentinelDefaultTokenServer();
// A sample for manually load config for cluster server.
// It's recommended to use dynamic data source to cluster manage config and rules.
// See the sample in DemoClusterServerInitFunc for detail.
ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig()
.setIdleSeconds(600)
.setPort(11111));
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton("study-process-server-dev"));
// Start the server.
tokenServer.start();
}
}
tokenServer是在main方法中启动的,并不是通过SpringBoot启动的。为了方便测试,创建了三个SpringBoot项目。
先启动token-server,在启动c1 和 c2,然后在dashboard里边就可以看到了。
有问题可以在评论区评论,技术问题可以私聊我。