Spring Cloud Gateway+Consul对Netty Socket IO+SSL负载均衡
问题
项目当中用到了WebRTC,这玩意调用摄像头必须是在https情况下,然后就直接把前端的服务器nginx弄了个ssl证书,结果项目在建立NettySocket连接的时候使用的是http协议被浏览器阻止了,所以只能把NettySocketIO服务也升级成SSL。这样的结果就是nginx,gateway,netty socket三个服务都要变成https。
Netty Socket IO
- netty socket io设置ssl还是比较简单的
public SocketIOServer socketIoServer() {
Configuration config = new Configuration();
//单次发送数据最大值1M
config.setMaxHttpContentLength(1024 * 1024);
config.setBossThreads(1);
config.setWorkerThreads(100);
config.setAuthorizationListener(handshakeData -> true);
config.setHostname(address);
config.setPort(port);
config.setKeyStorePassword("证书密码");
InputStream stream = this.getClass().getResourceAsStream("Resource目录下的证书");
config.setKeyStore(stream);
return new SocketIOServer(config);
}
证书去阿里云腾讯云什么的申请,都是免费的。需要注意的是证书路径写错了启动是不会报错的,只会按照没有设置ssl来启动。可以在SocketIOChannelInitializer这个类上打上断点看下
2. netty socket io注册到consul
netty socket io和spring boot的tomcat是两个不同的服务器(端口号都不相同)。注册到consul中配置要注意一下
spring:
application:
name: socket
cloud:
consul:
host: consul.nyist.com
port: 8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true
healthCheckInterval: 5s
port: 8006 #这个是调用服务时候的端口
ip-address: www.socket.com #这个地方填域名,使用ip自己试一下会有什么问题
#健康检查的地址,端口号是tomcat的端口号
health-check-url: http://${spring.cloud.consul.discovery.ip-address}:${server.port}/actuator/health
Gateway
gateway的ssl也挺简单的,可以去搜一下其他博客
对socket的配置
- id: socket
#注意这里是https
uri: lb:https://socket
predicates:
- Path=/socket.io/**,
filters:
- StripPrefix=0
我这里前端用的是vue-socket.io ,配置需要加上transports: [‘websocket’]
原因是websocket建立连接需要发起多次请求,Gateway会把这个过程的多次请求转发到不同的服务
Vue.use(new VueSocketIO({
debug: true,
connection: '',
vuex: {
store,
actionPrefix: 'SOCKET_',
mutationPrefix: 'SOCKET_'
},
options: {path: '', autoConnect: true, transports: ['websocket']}
}))
最后附上nginx的配置
server {
listen 443 ssl;
server_name xxxx;
ssl_certificate xxx; # 这个是证书的crt文件所在目录
ssl_certificate_key xxx; # 这个是证书key文件所在目录
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /socket.io/{
proxy_pass https://gateway.nyist.xyz:8011;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}