2-3 스텔스 전삼

4018 단어

응용 프로그램


먼저 두보의 은식 전삼이 어떤 효과인지 보자.코드는 아래와 같다.
public class PersonServiceImpl implements PersonService {
    public String say(String name) {
        Object obj = RpcContext.getContext().getAttachments();
        System.out.println("         "+obj);
        return name + " say hello ";
    }
}

public class MainClient {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        PersonService p= applicationContext.getBean(PersonService.class);
        RpcContext.getContext().setAttachment("aaa", "bbb");
        RpcContext.getContext().setAttachment("eee", "ccc");
        System.out.println(p.say("abcd"));
    }
}


위의 코드는 서비스 소비자가 인쇄한 스텔스 파라미터입니다.다음 코드는 클라이언트가 전달하는 스텔스 매개 변수입니다.

서비스 제공자:


앞에서 말한 바와 같이dubbo의 서비스 제공자는netty 요청을 받아들여 매개 변수를 하나의com으로 봉인하는 것을 알고 있습니다.alibaba.dubbo.remoting.exchange.Request 객체객체에는 Object mData 속성이 있습니다.실제 호출할 때, Decodeable RpcInvocation일 수 있으며, 이 종류는 RpcInvocation에서 계승될 수 있습니다.RpcInvocation에는 두 가지 속성이 있습니다.Object[]arguments와Map attachments 여기의arguments는 함수 매개 변수이고attachments는 은식 매개 변수입니다.
Request는 요청 정보입니다. 그 안에 하나의 속성이 Invocation이고 Invocation의 속성도 Request가 있습니다. 둘은 서로 가지고 있는 관계입니다.
dubbo 내부 함수 호출 체인에서 모두 Invocation으로 함수 매개 변수로 전달됩니다.다음 코드가 되면 이 스텔스 매개 변수를 봉인합니다.
public class ContextFilter implements Filter {
    public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
        Map attachments = invocation.getAttachments();
        if (attachments != null) {
            attachments = new HashMap(attachments);
            attachments.remove(Constants.PATH_KEY);
            attachments.remove(Constants.GROUP_KEY);
            attachments.remove(Constants.VERSION_KEY);
            attachments.remove(Constants.DUBBO_VERSION_KEY);
            attachments.remove(Constants.TOKEN_KEY);
            attachments.remove(Constants.TIMEOUT_KEY);
        }
        RpcContext.getContext()
                .setInvoker(invoker)
                .setInvocation(invocation)
                //      。
                .setAttachments(attachments)
                .setLocalAddress(invoker.getUrl().getHost(), 
                                 invoker.getUrl().getPort());
        if (invocation instanceof RpcInvocation) {
            ((RpcInvocation)invocation).setInvoker(invoker);
        }
        try {
           //      RpcContext ,    finally   。
            return invoker.invoke(invocation);
        } finally {
            RpcContext.removeContext();
        }
    }
}

실제로는 라인에 따라 묶여 있다.
public class RpcContext {
    private static final ThreadLocal LOCAL = new ThreadLocal() {
        @Override
        protected RpcContext initialValue() {
            return new RpcContext();
        }
    };
    public static RpcContext getContext() {
        return LOCAL.get();
    }

서비스 소비자:


소비자와 생산자의 코드 원리는 같다. 소비자 코드는 다음과 같다.
@Activate(group = Constants.CONSUMER, order = -10000)
public class ConsumerContextFilter implements Filter {
    public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
        RpcContext.getContext()
                .setInvoker(invoker)
                .setInvocation(invocation)
                .setLocalAddress(NetUtils.getLocalHost(), 0)
                .setRemoteAddress(invoker.getUrl().getHost(), 
                                  invoker.getUrl().getPort());
        if (invocation instanceof RpcInvocation) {
            ((RpcInvocation)invocation).setInvoker(invoker);
        }
        try {
            return invoker.invoke(invocation);
        } finally {
            RpcContext.getContext().clearAttachments();
        }
    }
}

좋은 웹페이지 즐겨찾기