本文共 3936 字,大约阅读时间需要 13 分钟。
实际开发中,为了保证系统的性能问题,我们会使用多线程,或者保证非核心功能不要阻塞你的同步线程,即异步处理。
在策略模块中,我们需要使用多种过滤器,对从MQ中接收到的数据进行过滤处理。
为了保证灵活性和高可用,【必须在程序不重启的前提下实现过滤器的可拔插和删除
】
解决思想:
@Service
或者其他注解注入的形式,则会将【遵从了同一个接口的类封装为一个map集合
】在redis中放一个list集合,值是过滤器实现类的名字,也就是@Service的值;我们在执行过滤的时候,List集合遍历,从map中获取实现类执行即可
】我们的任务分为了Eureka模块、RedisCache缓存模块以及Strategy策略模块,这里我们只展示缓存和策略模块的重点内容。
/*** RedisConfig,对RedisTemplate的序列化进行配置*/@Configurationpublic class RedisConfig { @Bean public RedisTemplateredisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); //使用jackjson序列化 Jackson2JsonRedisSerializer
/*** 定义一个过滤接口*/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}") ListgetList(@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/