2-3 스텔스 전삼
응용 프로그램
먼저 두보의 은식 전삼이 어떤 효과인지 보자.코드는 아래와 같다.
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();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.