<< c# - How do I make a thread dump in .NET ? (a la JVM thread dumps) - Stack Overflow | 首页 | CXF之用Dispatch处理异步调用实例 - fhd001的专栏 - 博客频道 - CSDN.NET >>

java 服务降级开关设计思路 - 程序员之路 - 博客频道 - CSDN.NET

java 服务屏蔽开关系统,可以手工降级服务,关闭服务 基于spring AOP机制,可以在特殊情况下屏蔽相关service类的某些返回,并且支持定义默认返回结果,随机屏蔽某些异常服务。 通过启动一个内置的http server来监听外部指令。

对当前应用的影响。代码请查看 https://github.com/zhwj184/autoswitch

使用指南:

1.在spring配置文件中添加如下,其中switch-service-pointcut是添加紧急情况下需要屏蔽的方法列表

[java] view plaincopy
 
  1. <aop:config proxy-target-class="true"></aop:config>  
  2.   
  3. <bean id="switchInteceptor" class="org.autoswitch.SwitchInteceptor">  
  4. </bean>  
  5. <bean id="switch-service-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">  
  6.     <property name="patterns">  
  7.         <list>  
  8.             <value>org.autoswitch.test.*</value>  
  9.         </list>  
  10.     </property>  
  11. </bean>  
  12. <aop:config>  
  13.     <aop:advisor advice-ref="switchInteceptor" pointcut-ref="switch-service-pointcut"/>  
  14. </aop:config>  
  15.   
  16. <bean id="wwitchControlHttpServer" class="org.autoswitch.SwitchControlHttpServer" init-method="init"></bean>  
  17.   
  18. <bean id="testService" class="org.autoswitch.test.TestServiceImpl" />  
  19.   
  20. <bean id="testController" class="org.autoswitch.test.TestController" />  

 例如下面的service,上面注释分别是在应用启动后手工屏蔽该服务调用,以后每次调用直接用参数的jsonResult反序列后返回, classmethod是具体到某个方法名称,status为open关闭该服务,close表示重新打开服务,jsonResult是mock返回结果的json串, 如果是基本类型,则必须用ret作为key,其他list,bean之类的就直接用json串,type表示如果list有泛型的话则是返回的类完整类型;

 

[java] view plaincopy
 
  1. public class TestServiceImpl implements TestService{  
  2. //http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.hello&status=open&jsonResult=1  
  3. public void hello(){  
  4.     System.out.println("hello");  
  5. }  
  6.   
  7. //http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.sayHello&status=open&jsonResult={ret:%22goodbuy%22}  
  8. public String sayHello(){  
  9.     return "sayHello";  
  10. }  
  11. //http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.getNames&status=open&jsonResult=[{"catList":[],"id":1,"name":"aaa"},{"catList":[],"id":1,"name":"aaa"},{"catList":[],"id":1,"name":"aaa"}]&type=org.autoswitch.test.TestBean  
  12. public List<TestBean> getNames(){  
  13.     return null;  
  14. }  
  15.   
  16. <span data-mce-style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 12px;" style="color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 12px;">// http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.getBeans&status=open&jsonResult={"catList":["123","456","789"],"id":1,"name":"aaa"} public TestBean getBeans(){ return null; }</span><span data-mce-style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 12px;" style="color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 12px;">}</span>  

3调用示例代码

[java] view plaincopy
 
  1. public class MainTest {  
  2.   
  3.   public static void main(String[] args) {  
  4.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-bean.xml");  
  5.         TestService testControl = (TestService) context.getBean("testService");  
  6.         try{  
  7.             testControl.hello();  
  8.             System.out.println(testControl.sayHello());  
  9.             List<TestBean> list = testControl.getNames();  
  10.             for(TestBean bean: list){  
  11.                 System.out.println(bean.getId() + bean.getName() + bean.getCatList());  
  12.             }  
  13.             TestBean bean = testControl.getBeans();  
  14.             System.out.println(bean.getId() + bean.getName() + bean.getCatList());  
  15.         }catch(Exception e){}  
  16.   
  17.   
  18.         for(int i = 0; i < 10; i++){  
  19.             try{  
  20. //              testControl.hello();  
  21.                 System.out.println(testControl.sayHello());  
  22. //              List<TestBean> list = testControl.getNames();  
  23. //              for(TestBean bean: list){  
  24. //                  System.out.println(bean.getId() + bean.getName() + bean.getCatList());  
  25. //              }  
  26. //              TestBean bean = testControl.getBeans();  
  27. //              System.out.println(bean.getId() + bean.getName() + bean.getCatList());  
  28.             }catch(Exception e){  
  29.                 e.printStackTrace();  
  30.             }     
  31.         }  
  32.   
  33.     }  
  34. }  

 4.输出

[java] view plaincopy
 
  1. Listening on port 8080  
  2. hello  
  3. sayHello  
  4. Incoming connection from /127.0.0.1  
  5. New connection thread  
  6. goodbuy  
  7. goodbuy  
  8. Incoming connection from /127.0.0.1  
  9. New connection thread  
  10. sayHello  
  11. sayHello  
  12. sayHello  
  13. sayHello  
  14. sayHello  
  15. sayHello  
  16. sayHello  
  17. sayHello  

 这里只是提供一种示例,如果要在生产环境中使用,则需要对并发控制,返回结果的序列化,方法名称一致参数不一致等各种情况进行控制, 同时还需要对权限,后台管理系统等可以做优化。

 

阅读全文……

标签 : ,



发表评论 发送引用通报