Spring Cloud(微服务)学习篇(七)
1.使用代码的方式实现流量限制规则
1.1 变更SentinelController类
1.1.1 加入的代码
@PostConstruct
public void FlowRule ( ) {
List < FlowRule > rules = new ArrayList < FlowRule > ( ) ;
FlowRule rule = new FlowRule ( ) ;
rule. setResource ( "find" ) ;
rule. setCount ( 7 ) ;
rule. setGrade ( RuleConstant . FLOW_GRADE_QPS ) ;
rule. setLimitApp ( "default" ) ;
rules. add ( rule) ;
FlowRuleManager . loadRules ( rules) ;
}
1.2.1 完整的SentinelController类代码
package com. zlz. controller ;
import com. alibaba. csp. sentinel. annotation. SentinelResource ;
import com. alibaba. csp. sentinel. slots. block. RuleConstant ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRule ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRuleManager ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
import javax. annotation. PostConstruct ;
import java. util. ArrayList ;
import java. util. List ;
@RestController
public class SentinelController {
int count= 0 ;
@SentinelResource ( "find" )
@RequestMapping ( "find" )
public String find ( ) {
count++ ;
System . out. println ( "进入用户查询方法" ) ;
return "查询用户:" + count;
}
@PostConstruct
public void FlowRule ( ) {
List < FlowRule > rules = new ArrayList < FlowRule > ( ) ;
FlowRule rule = new FlowRule ( ) ;
rule. setResource ( "find" ) ;
rule. setCount ( 7 ) ;
rule. setGrade ( RuleConstant . FLOW_GRADE_QPS ) ;
rule. setLimitApp ( "default" ) ;
rules. add ( rule) ;
FlowRuleManager . loadRules ( rules) ;
}
}
1.2 测试
1.2.1 查看Mysql服务是否打开(只有mysql服务打开,启动nacos窗口才正常)
1.2.2 启动nacos服务
1.2.3 启动Sentinel控制台项目
a 找到sentinel控制台jar包所在的位置➡输入java -jar sentinel-dashboard.jar➡回车
b 回车后的界面
c 通过浏览器登录进入Sentinel后台界面
c.1 在浏览器输入地址localhost:8080后跳转的页面
c.2 输入账户和密码后跳转的页面
1.2.4 启动用户服务
1.2.5 点击刷新Sentinal控制台界面➡点击shop-user➡流控规则
1.2.6 点击编辑
1.2.7 点击编辑按钮后跳转的页面
2 对流量限流给出友好提示
2.1 定义方法的形式
2.1.1 更新SentinelController类
a 加入的代码
public String xlHandler ( BlockException e) {
return "当前访问人数过多 请稍后再试" ;
}
b 完整的SentinelController类
package com. zlz. controller ;
import com. alibaba. csp. sentinel. annotation. SentinelResource ;
import com. alibaba. csp. sentinel. slots. block. BlockException ;
import com. alibaba. csp. sentinel. slots. block. RuleConstant ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRule ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRuleManager ;
import com. zlz. handler. SentinelHandler ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
import javax. annotation. PostConstruct ;
import java. util. ArrayList ;
import java. util. List ;
@RestController
public class SentinelController {
int count= 0 ;
@SentinelResource ( value= "find" , blockHandler = "xlHandler" )
@RequestMapping ( "find" )
public String find ( ) {
count++ ;
System . out. println ( "进入用户查询方法" ) ;
return "查询用户:" + count;
}
@PostConstruct
public void FlowRule ( ) {
List < FlowRule > rules = new ArrayList < FlowRule > ( ) ;
FlowRule rule = new FlowRule ( ) ;
rule. setResource ( "find" ) ;
rule. setCount ( 7 ) ;
rule. setGrade ( RuleConstant . FLOW_GRADE_QPS ) ;
rule. setLimitApp ( "default" ) ;
rules. add ( rule) ;
FlowRuleManager . loadRules ( rules) ;
}
public String xlHandler ( BlockException e) {
return "当前访问人数过多 请稍后再试" ;
}
}
2.1.2 测试
a 重新启动用户服务
b jemeter压力测试
b.1 添加线程组
b.2 编辑线程组
b.3 创建HTTP请求
b.4 编辑HTTP请求
b.5 在线程组下面创建结果树
b.6 点击绿色按钮➡点击NO按钮
b.7 点击前7个的HTTP请求的任意一个,都是正常访问
b.8 点击后三个的HTTP请求的任意一个,都是显示当前访问人数过多,请稍后再试
2.2 定义类的方式(处理方法在类中)
2.2.1 在zlz包下创建handler包并创建SentinelHandler类
package com. zlz. handler ;
import com. alibaba. csp. sentinel. slots. block. BlockException ;
public class SentinelHandler {
public static String xlHandler ( BlockException e) {
return "当前访问人数过多 请稍后再试" ;
}
}
2.2.2 更新SentinelController类
a 加入的代码
b 完整的SentinelController类
package com. zlz. controller ;
import com. alibaba. csp. sentinel. annotation. SentinelResource ;
import com. alibaba. csp. sentinel. slots. block. BlockException ;
import com. alibaba. csp. sentinel. slots. block. RuleConstant ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRule ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRuleManager ;
import com. zlz. handler. SentinelHandler ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
import javax. annotation. PostConstruct ;
import java. util. ArrayList ;
import java. util. List ;
@RestController
public class SentinelController {
int count= 0 ;
@SentinelResource ( value= "find" , blockHandler = "xlHandler" , blockHandlerClass = SentinelHandler . class )
@RequestMapping ( "find" )
public String find ( ) {
count++ ;
System . out. println ( "进入用户查询方法" ) ;
return "查询用户:" + count;
}
@PostConstruct
public void FlowRule ( ) {
List < FlowRule > rules = new ArrayList < FlowRule > ( ) ;
FlowRule rule = new FlowRule ( ) ;
rule. setResource ( "find" ) ;
rule. setCount ( 7 ) ;
rule. setGrade ( RuleConstant . FLOW_GRADE_QPS ) ;
rule. setLimitApp ( "default" ) ;
rules. add ( rule) ;
FlowRuleManager . loadRules ( rules) ;
}
}
2.2.2 测试
a 重新启动用户服务
b jemeter压力测试
b.1 清除之前的结果
b.2 重新点击绿色按钮➡点击NO按钮
b.3 点击前7个的HTTP请求的任意一个,都没有限流提示
b.4 点击后三个的HTTP请求的任意一个,都有限流提示