博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略过滤器的灵活性分析
阅读量:3962 次
发布时间:2019-05-24

本文共 3936 字,大约阅读时间需要 13 分钟。

实际开发中,为了保证系统的性能问题,我们会使用多线程,或者保证非核心功能不要阻塞你的同步线程,即异步处理。

在策略模块中,我们需要使用多种过滤器,对从MQ中接收到的数据进行过滤处理。

为了保证灵活性和高可用,【必须在程序不重启的前提下实现过滤器的可拔插和删除

解决思想

  • Spring中,如果使用了@Service或者其他注解注入的形式,则会将【遵从了同一个接口的类封装为一个map集合
  • 那么我们就可以这么处理【在redis中放一个list集合,值是过滤器实现类的名字,也就是@Service的值;我们在执行过滤的时候,List集合遍历,从map中获取实现类执行即可
代码实现

我们的任务分为了Eureka模块、RedisCache缓存模块以及Strategy策略模块,这里我们只展示缓存和策略模块的重点内容。

RedisCache
/*** RedisConfig,对RedisTemplate的序列化进行配置*/@Configurationpublic class RedisConfig {
@Bean public RedisTemplate
redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate
redisTemplate = new RedisTemplate<>(); //使用jackjson序列化 Jackson2JsonRedisSerializer
jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); // value值的序列化采用jsonRedisSerializer //redisTemplate.setValueSerializer(jsonRedisSerializer); redisTemplate.setHashValueSerializer(jsonRedisSerializer); //这是将一般的value值序列化为string redisTemplate.setValueSerializer(new StringRedisSerializer()); // key的序列化采用StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; }}/*** CacheServiceImpl*/@Servicepublic class CacheServiceImpl implements CacheService {
@Autowired private RedisTemplate redisTemplate; @Override public List
getList(String key) {
List
list = redisTemplate.opsForList().range(key, 0, -1); return list; }}/*** RedisController,用于策略进行feign调用*/@RestController@RequestMapping("/cache")public class RedisController {
@Autowired private CacheService cacheService; @RequestMapping("/getList/{key}") public List
getList(@PathVariable("key") String key) { return cacheService.getList(key); }}
Strategy
/*** 定义一个过滤接口*/public interface ServiceFilter {
void excute();}/*** 过滤实现类遵从该接口,我们使用了四个:黑名单、脏词、话费、号段,这里列举一个*/@Servicepublic class PhaseFilter implements ServiceFilter {
@Override public void excute() {
System.err.println("执行号段管理业务"); }}/*** MyFeign*/@FeignClient(value = "REDISCACHE")public interface MyFeign {
@RequestMapping("/cache/getList/{key}") List
getList(@PathVariable("key") String key);}/*** 我们这里使用servlet执行所有过滤器*/@WebServlet(name = "strategyServlet", urlPatterns = "/ss")public class StrategyServlet extends HttpServlet {
@Autowired private MyFeign myFeign; /** * 所有实现了ServiceFilter接口的类都会放入到一个map中,我们从缓存获取key的list集合,遍历即可获取过滤器实例,遍历执行方法 */ @Autowired private Map
serviceFilterMap; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List
filterList = myFeign.getList(MyConstants.FILTERLIST); for (String filterName : filterList) {
serviceFilterMap.get(filterName).excute(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); }}/*** 启动类的配置,注意要继承SpringBootServletInitializer类*/@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients@ServletComponentScanpublic class StrategyStartApp extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(StrategyStartApp.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(StrategyStartApp.class); }}
打印结果
//第一次执行执行黑名单处理业务执行脏词过滤业务执行手机话费相关业务执行号段管理业务//第二次我们只在redis中调整了顺序执行手机话费相关业务执行号段管理业务执行脏词过滤业务执行黑名单处理业务//第三次我们只在redis中删除某些过滤业务执行脏词过滤业务执行黑名单处理业务
策略中的一些核心难点业务

在策略过滤中,还有一些核心难点业务,比如限流、比如脏词,比如动态路由的创建,代码详见【GitHub】

转载地址:http://xvgzi.baihongyu.com/

你可能感兴趣的文章
常见Oracle HINT的用法
查看>>
JAVA中各类CACHE机制实现的比较 [转]
查看>>
PL/SQL Developer技巧
查看>>
3-python之PyCharm如何新建项目
查看>>
15-python之while循环嵌套应用场景
查看>>
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
[心情] 如果有一天
查看>>
[Linux] 常用 linux 系统命令及维护备忘
查看>>