这两句的主要意图在于将Consumer工程关联到Sentinel控制台,便于后续通过控制台统一管控
改造原有的PersonController我们先创建一个ViewObject
文章插图
代码如下:
package com.example.dubbonacosconsumer.vo;import com.example.dubbonacosapi.model.Person;import java.util.List;public class SelectRetVo {private List<Person> persons;private String error;public List<Person> getPersons() {return persons;}public void setPersons(List<Person> persons) {this.persons = persons;}public String getError() {return error;}public void setError(String error) {this.error = error;}}然后是PersonController的改造
package com.example.dubbonacosconsumer.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.BlockException;import com.example.dubbonacosapi.model.Person;import com.example.dubbonacosapi.service.PersonService;import com.example.dubbonacosconsumer.vo.SelectRetVo;import org.apache.dubbo.config.annotation.DubboReference;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;@RestController@RequestMapping("/person")public class PersonController {@DubboReferencePersonService service;@PostMapping("/insert")public Integer insert(Person person) {return service.insert(person);}@PostMapping("/update")public Integer update(Person person) {return service.update(person);}@PostMapping("/delete")public Integer delete(int id) {return service.delete(id);}@GetMapping("/select")@SentinelResource(value = "https://www.huyubaike.com/biancheng/person/select", blockHandler = "selectBlock")public SelectRetVo select() {SelectRetVo vo = new SelectRetVo();vo.setPersons(service.select());vo.setError("ok");return vo;}public SelectRetVo selectBlock(BlockException e) {SelectRetVo vo = new SelectRetVo();vo.setPersons(new ArrayList<Person>());vo.setError(“当前访问人数过多,请稍后...”);return vo;}}我们将原有的select方法的返回值从原来的List<Person>升级为SelectPersonVo,后者在前者原有基础上扩展了一个error字段,用于返回异常信息
接着是本节的关键:select方法新增@SentinelResource注解,我们前边讲过:Sentinel根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略
因此这个注解的作用是——用于标明这是一个Sentinel系统中的资源
value代表这个资源的名称是person/select,这个名字可以随自己的习惯自定义这里指定的selectBlock方法,在定义时是有硬性要求的:
blockHandler指定了一个方法,这个方法在Sentinel系统触发某种规则的时候会被执行,关于“某种规则”我们稍后会讲
1. 保留select方法一样的参数,外加一个BlockException参数控制台的使用我们像上一节一样,分别启动provider和consumer,然后刷新Sentinel控制台页面
2. 返回值必须和select方法相同 —— 所以明白为什么要额外定义一个SelectRetVo了吧?
文章插图
看到这个界面的时候,你是否有种豁然开朗的感觉?
因为consumer中定义了Sentinel资源,所以当dubbo-nacos-consumer工程执行之后,控制台会有相关显示
而功能菜单中有N多项的名称都是XX规则,这也就是前边我们定义的blockHandler对应的某种规则
我们在post中调用consumer中的select方法,此时实时监控页面显示如下内容:
文章插图
这里的person/select自然就是我们定义的【资源】,控制台配套显示了其各项指标数据,很直观也很方便
经验总结扩展阅读
- 开发商不给办理房产证去哪里投诉 开发商办理房产证流程大概多久时间
- 最新苹果iOS个人开发者账号注册申请流程 申请苹果id账号注册
- 基于案例分析 MySQL Group Replication 的故障检测流程
- 星之彼端叶灵真伤流怎么搭配阵容
- 花呗信用购能不能关闭 关闭流程是怎样的
- 直播卖货怎么运作全流程
- 中南大学国家一流本科专业建设点
- 全国新一轮双一流大学名单排名
- 原型法的基本步骤和工作内容是什么 原型法流程
- 被踢出双一流的三所大学是哪三所