`

java 服务降级开关设计思路

 
阅读更多

 

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

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

使用指南:

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

<aop:config proxy-target-class="true"></aop:config>

<bean id="switchInteceptor" class="org.autoswitch.SwitchInteceptor">
</bean>
<bean id="switch-service-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="patterns">
        <list>
            <value>org.autoswitch.test.*</value>
        </list>
    </property>
</bean>
<aop:config>
    <aop:advisor advice-ref="switchInteceptor" pointcut-ref="switch-service-pointcut"/>
</aop:config>

<bean id="wwitchControlHttpServer" class="org.autoswitch.SwitchControlHttpServer" init-method="init"></bean>

<bean id="testService" class="org.autoswitch.test.TestServiceImpl" />

<bean id="testController" class="org.autoswitch.test.TestController" />

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

 

public class TestServiceImpl implements TestService{
//http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.hello&status=open&jsonResult=1
public void hello(){
    System.out.println("hello");
}

//http://localhost:8080/control/a.htm?classmethod=org.autoswitch.test.TestServiceImpl.sayHello&status=open&jsonResult={ret:%22goodbuy%22}
public String sayHello(){
    return "sayHello";
}
//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
public List<TestBean> getNames(){
    return null;
}

// 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; }}

3调用示例代码

public class MainTest {

  public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-bean.xml");
        TestService testControl = (TestService) context.getBean("testService");
        try{
            testControl.hello();
            System.out.println(testControl.sayHello());
            List<TestBean> list = testControl.getNames();
            for(TestBean bean: list){
                System.out.println(bean.getId() + bean.getName() + bean.getCatList());
            }
            TestBean bean = testControl.getBeans();
            System.out.println(bean.getId() + bean.getName() + bean.getCatList());
        }catch(Exception e){}


        for(int i = 0; i < 10; i++){
            try{
//              testControl.hello();
                System.out.println(testControl.sayHello());
//              List<TestBean> list = testControl.getNames();
//              for(TestBean bean: list){
//                  System.out.println(bean.getId() + bean.getName() + bean.getCatList());
//              }
//              TestBean bean = testControl.getBeans();
//              System.out.println(bean.getId() + bean.getName() + bean.getCatList());
            }catch(Exception e){
                e.printStackTrace();
            }   
        }

    }
}

 4.输出

Listening on port 8080
hello
sayHello
Incoming connection from /127.0.0.1
New connection thread
goodbuy
goodbuy
Incoming connection from /127.0.0.1
New connection thread
sayHello
sayHello
sayHello
sayHello
sayHello
sayHello
sayHello
sayHello

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

 

 思路比较简单,就是使用spring 的aop机制。

public class SwitchInteceptor implements MethodInterceptor{

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		Method method = invocation.getMethod();
		String classMethod = method.getDeclaringClass().getName() + "." + method.getName();
		if(ClassMethodStatusManager.getInstance().isOpen(classMethod)){
			Class retClass = method.getReturnType();
			if(retClass.getName().equals("void")){
				return 1;
			}
			Object obj = SimpleReturnObjectComplier.getRetInstance(classMethod, retClass);	
			return obj;
		}
		return invocation.proceed();
	}

}

 

14
1
分享到:
评论
1 楼 小马在天 2013-03-24  
可以看下SwitchInteceptor类代码吗?

相关推荐

    基于openfeign+sentinel的统一降级服务代码

    而Sentinel是Alibaba开源的一款流量控制、熔断降级的Java库,适用于分布式服务架构。在这个“基于openfeign+sentinel的统一降级服务代码”项目中,我们将会探讨如何结合两者来实现更高效的容错和降级策略。 首先,...

    基于Java开发的简单、易用、高性能的服务降级系统,支持限流、熔断和降级等功能,服务端必备!!.zip

    这个基于Java的服务降级系统可能包含以下核心组件和设计: 1. 限流器:根据设定的规则,限制特定服务的调用频率。 2. 熔断器:监控服务调用的失败情况,当达到预设条件时,自动切换到熔断状态。 3. 降级策略:在...

    Feign集成Hystrix实现服务熔断和服务降级案例Java代码.zip

    Feign集成Hystrix实现服务熔断和服务降级案例Java代码

    springcloud feign整合hystrix(服务降级).doc

    在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错...在微服务架构中,这种服务间调用的健壮性设计是至关重要的,能够帮助我们构建出更稳定、更可靠的分布式系统。

    华为EC1308固件降级服务器

    ASP在这里可能是“Application Service Provider”的缩写,即应用服务提供商,意味着这个服务器为用户提供固件降级的相关应用或服务。 进行固件降级的过程需要注意以下几点: 1. **备份当前固件**:在执行任何固件...

    springCloud_hystrix(断路由服务降级)

    断路器模式是一种用于处理服务间依赖关系的模式,其核心思想是在服务调用链路上设置一个开关(断路器),当检测到下游服务出现故障时,自动将该开关切换至断开状态,从而阻止对该服务的进一步调用,防止故障蔓延。...

    Java Application Service Java 应用服务框架

    3. **服务治理**:Java应用服务框架通常包含服务注册与发现、负载均衡、熔断和降级等服务治理功能,这些对于分布式系统来说至关重要。例如,使用Eureka作为服务注册中心, Ribbon进行客户端负载均衡,Hystrix实现...

    37_基于dubbo如何做服务治理、服务降级以及重试?.zip

    在IT行业中,服务治理、服务降级和重试策略是微服务架构中不可或缺的重要组成部分,尤其是在基于Dubbo的分布式系统中。本资料包主要探讨了如何在Dubbo框架下实现这些功能,帮助提升系统的稳定性和容错性。 首先,...

    E1308降级服务器ASP

    华为E1308降级服务器

    基于Java的Akali轻量级本地化热点检测/降级框架设计源码

    本项目是采用Java编写的Akali轻量级本地化热点检测/降级框架设计源码,共包含47个文件,涵盖37个Java源文件、2个XML配置文件以及其他各类文件。Akali框架仅需10秒即可轻松接入使用,特别适合大流量环境下的应用,是...

    计算机后端-Java-Java高并发从入门到面试教程-务降级与服.zip

    本教程专注于Java高并发编程,这是现代软件系统设计中的关键部分,特别是在处理大量用户请求和服务之间交互时。"务降级与服务"是这个主题的一个重要概念,它涉及到在系统负载过高或者资源紧张时如何确保核心业务的...

    优雅降级方案

    ### 三、优雅降级思路 优雅降级的核心在于,通过智能决策机制,在不影响核心业务的前提下,有选择性地放弃部分非关键服务,以保持整体系统的稳定运行。主要策略包括: 1. **减少系统内部排队**:优化请求处理流程...

    Java分布式架构设计实战视频课程(2022最新版,13章全)

    Java分布式架构设计实战课程是2022年最新的学习资源,涵盖了从基础到高级的全方位内容,旨在帮助开发者深入理解并掌握Java在分布式系统中的应用。这套课程共有13个章节,每个章节都针对特定的分布式架构技术或概念...

    基于Spring-Cloud-Netfix的Java服务架构设计与源码分析

    本项基于Spring Cloud Netflix架构的Java服务设计源码,总计包含86个文件,涵盖21个YAML配置文件、20个Java源文件、16个XML配置文件、10个IML项目文件、9个lst列表文件、5个原始文件、2个Git忽略文件、2个Markdown...

    分布式设计-降级设计

    分布式的设计以及hystrix的一些Q&A, 其中如果有其他的第三方工具再进行补充

    vivo机型售后系统降级工具

    【vivo机型售后系统降级工具】是一款专为vivo手机设计的系统版本回退工具,主要用于解决用户在使用过程中遇到的问题或者为了适应特定需求而将手机系统版本降低到之前的版本。这款工具对于那些遇到新系统兼容性问题、...

    三星Galaxy Buds Pro固件降级教程(含电脑降级工具,Windows版)

    软件界面再往下会看到“系统”菜单,点进去会看到“安装固件更新”,继续点击进去会看到“允许固件降级”开关,打开那个开关,上面会弹出不同时间的固件版本信息,找到版本信息末尾编号为AUA1的固件选中,然后右下角...

    基于SpringCloud的Java服务注册与调用解决方案源码

    系统支持服务注册与发现(Eureka/Consul)、服务调用(Ribbon/OpenFeign)、服务降级与熔断(Hystrix)、服务网关(Gateway)等功能,同时整合了阿里巴巴的Nacos服务配置中心和服务总线,实现了服务的集中管理和高效...

Global site tag (gtag.js) - Google Analytics