发表于: 2020-01-19 15:50:44
3 1251
啥也不说就是干!!
今天完成的事情:
1、将之前的发短信 Service 部署到两台 server 上
那么服务端需要暴露两个 Service 在不同的端口号上
@Resource
private SmsCodeSendService smsCodeSendService;
@Resource
private SmsCodeSendService smsCodeSendService2;
@Bean
public RmiServiceExporter getRmiServiceExporter() {
RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
rmiServiceExporter.setServiceName("smsCodeSendService");
rmiServiceExporter.setService(smsCodeSendService);
rmiServiceExporter.setServiceInterface(SmsCodeSendService.class);
rmiServiceExporter.setRegistryPort(2002);
return rmiServiceExporter;
}
@Bean
public RmiServiceExporter getRmiServiceExporter2() {
RmiServiceExporter rmiServiceExporter2 = new RmiServiceExporter();
rmiServiceExporter2.setServiceName("smsCodeSendService2");
rmiServiceExporter2.setService(smsCodeSendService2);
rmiServiceExporter2.setServiceInterface(SmsCodeSendService.class);
rmiServiceExporter2.setRegistryPort(2003);
return rmiServiceExporter2;
}
2、Rmi client 方需要更改为随机访问不同的 Service
@Bean(name = "smsCodeSendService")
public RmiProxyFactoryBean getUserService() {
RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
rmiProxyFactoryBean.setServiceUrl("rmi://f0t1.top:2002/smsCodeSendService");
rmiProxyFactoryBean.setServiceInterface(SmsCodeSendService.class);
return rmiProxyFactoryBean;
}
@Bean(name = "smsCodeSendService2")
public RmiProxyFactoryBean getUserService2() {
RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
rmiProxyFactoryBean.setServiceUrl("rmi://f0t1.top:2003/smsCodeSendService");
rmiProxyFactoryBean.setServiceInterface(SmsCodeSendService.class);
return rmiProxyFactoryBean;
}
同时在调用方法时候也要随机调用这两个 Service,参考之前师兄的日志
@Override
public SmsInfo sendSMSCode(String phone) {
int flag = Math.random()>0.5? 1:0;
SmsInfo smsInfo = null;
try {
switch(flag){
case 1:
smsInfo = smsCodeSendService.sendSMSLoginCode(phone);
break;
default:
smsInfo = smsCodeSendService2.sendSMSLoginCode(phone);
break;
}
}catch(Exception e){
switch(flag){
case 1:
smsInfo = smsCodeSendService2.sendSMSLoginCode(phone);
break;
default:
smsInfo = smsCodeSendService.sendSMSLoginCode(phone);
break;
}
}
return smsInfo;
}
3、在 Nginx 上做负载均衡
分别启动两台 tomat 测试
深度思考
用 Nginx 部署,直接请求Nginx 进行分发,并且在客户端调用时随机调用不同 Service 方法
7 一个需要这个远程服务的客户端程序
RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。
应该是包含了业务逻辑,这样不同的业务就能拆分到不同而模块去
6.Thrift,Protobuffer分别是什么,一般用于什么场景?
1)Thrift: 支持的语言更广泛一些c++, java, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php
protobuf 目前还是只支持c++, java, python
2)Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..)
protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。
3)Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。
protobuf只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream.
4)thrift目前不支持Windows平台
protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。
5)thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc service framework,可以很方便的直接构建服务,不需要做太多其他的工作。
serialVersionUID:固定此类id值,避免改变对应的类,id值变化无法进行连接
明天计划的事情:
开始任务9,学习 dubbo
遇到的问题:
随机访问 Sevice 没思路,是参考之前师兄的日志实现的,不知道有没有更优的解决方案
评论