写代码之前我们先定义好工程结构
1 :Rpc-Server
服务发布
框架的RPC 服务器(用于将用户系统的业务类发布为 RPC 服务)
* 使用时可由用户依赖Spring容器注入到用户的业务系统中
2:Rpc-Registry
服务注册
Zookeeper 在该架构中扮演了“服务注册表”的角色,用于注册所有服务器的地址与端口,并对客户端提供服务发现的功能
3:Rpc-Common
通信编码,解码
4:Rpc-Client
框架的RPC 客户端(用于发送 RPC 请求)
RpcServer:
public class RpcServer implements ApplicationContextAware, InitializingBean {
private static final Logger LOGGER = LoggerFactory.getLogger(RpcServer.class);
private String serverAddress;
public RpcServer(String serverAddress) {
this.serverAddress = serverAddress;
}
public RpcServer(String serverAddress){
}
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
}
public void afterPropertiesSet() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel)
throws Exception {
}
}).option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
String[] array = serverAddress.split(":");
String host = array[0];
int port = Integer.parseInt(array[1]);
ChannelFuture future = bootstrap.bind(host, port).sync();
LOGGER.debug("server started on port {}", port);
future.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
}
RpcServer类实现了 ApplicationContextAware, InitializingBean 的两个接口,spring构造本对象时会调用setApplicationContext()方法,从而可以在方法中通过自定义注解获得用户的业务接口和实现,还会调用afterPropertiesSet()方法,在方法中启动netty服务器
总结:RpcServer为自定义rpc框架的核心类之一,用于使用者来发布服务.。RpcServer只提供了一个netty的服务端的。并没有像我们说的rpc服务接口。。好的。下篇我们通过自定义注解来实现我们的rpc的服务,并为netty 服务端和客户端提供编码解码的实现类