All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eagle.jfaster.org.protocol.NettyRpcProtocol Maven / Gradle / Ivy

/*
 * Copyright 2017 eagle.jfaster.org.
 * 

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *

*/ package eagle.jfaster.org.protocol; import com.google.common.base.Strings; import com.google.common.collect.Maps; import eagle.jfaster.org.client.NettyClient; import eagle.jfaster.org.config.ConfigEnum; import eagle.jfaster.org.config.common.MergeConfig; import eagle.jfaster.org.exception.EagleFrameException; import eagle.jfaster.org.logging.InternalLoggerFactory; import eagle.jfaster.org.pool.SuspendResumeLock; import eagle.jfaster.org.rpc.*; import eagle.jfaster.org.rpc.support.EagleRpcJdkRemoteInvoke; import eagle.jfaster.org.server.NettyServer; import eagle.jfaster.org.spi.SpiClassLoader; import eagle.jfaster.org.spi.SpiInfo; import eagle.jfaster.org.transport.*; import eagle.jfaster.org.transport.support.ServiceInvokeRouter; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** * * 把相应的协议暴露出去,相同的协议可以暴露在多个不同的端口 * * Created by fangyanpeng1 on 2017/7/31. */ @SpiInfo(name = "eagle") public class NettyRpcProtocol implements Protocol { private Map> host2Router = Maps.newHashMap(); private Map host2Server = Maps.newHashMap(); private AtomicBoolean alive = new AtomicBoolean(true); @Override public Exporter createServer(RemoteInvoke invoker) { MergeConfig config = invoker.getConfig(); InvokeRouter router = getInvokeRouter(invoker); Server nettyServer; if (router.needExport()) { //添加心跳响应 HeartBeatFactory heartBeatFactory = SpiClassLoader.getClassLoader(HeartBeatFactory.class).getExtension(config.getExt(ConfigEnum.heartbeatFactory.getName(), ConfigEnum.heartbeatFactory.getValue())); if (heartBeatFactory == null) { throw new EagleFrameException("HeartBeatFactory not exist,name: %s", config.getExt(ConfigEnum.heartbeatFactory.getName(), "")); } HeartBeat heartBeat = heartBeatFactory.createHeartBeat(config.copy()); router.addRemoteInvoke(new EagleRpcJdkRemoteInvoke(HeartBeat.class, heartBeat, heartBeat.getConfig())); // nettyServer = new NettyServer(config, router); nettyServer.start(); host2Server.put(config.hostPort(), nettyServer); } else { nettyServer = host2Server.get(config.hostPort()); } Exporter exporter = new NettyRpcExporter(invoker, nettyServer); exporter.init(); return exporter; } @Override public Refer createRefer(MergeConfig config, Class type) { Client client = new NettyClient(config, config.getInvokeCallBack(), config.getInterceptors()); SuspendResumeLock lock = SuspendResumeLock.FAUX_LOCK; //并发控制 int actives = config.getExtInt(ConfigEnum.actives.getName(), ConfigEnum.actives.getIntValue()); if (actives != 0) { long activesWait = config.getExtLong(ConfigEnum.activesWait.getName(), ConfigEnum.activesWait.getLongValue()); lock = new SuspendResumeLock(actives, activesWait); } //是否统计调用信息,如果配置了统计日志则统计各个方法的调用信息 String logName = config.getExt(ConfigEnum.statsLog.getName(), ConfigEnum.statsLog.getValue()); Refer refer = Strings.isNullOrEmpty(logName) ? new NettyRefer<>(client, config, type, lock) : new StatsNettyRefer<>(client, config, type, lock, InternalLoggerFactory.getInstance(logName)); refer.init(); return refer; } @Override public void close() { if (alive.compareAndSet(true, false)) { for (Map.Entry entry : host2Server.entrySet()) { entry.getValue().shutdown(); } host2Server.clear(); host2Router.clear(); } } @Override public boolean isOpen() { return alive.get(); } private synchronized InvokeRouter getInvokeRouter(RemoteInvoke invoke) { String hostInfo = invoke.getConfig().hostPort(); InvokeRouter router = host2Router.get(hostInfo); if (router != null) { router.addRemoteInvoke(invoke); } else { router = new ServiceInvokeRouter(invoke); host2Router.put(hostInfo, router); } return router; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy