1、 集群长连接 一般都需要网关。 网关选择的spring-cloud-gateway
2、注册中心选择的nacos
3、maven 依赖
<dependencyManagement>
<dependencies>
<!--支持Spring Boot 2.1.X-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.10.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Swagger2 - RESTful API文档-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!--jetcache缓存 -->
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.5.14</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--自省和监控的集成功能-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>
<!--熔断降级-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--日志跟踪-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--消息总线-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--热加载-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--使用 lombok 简化 Java 代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>compile</scope>
</dependency>
<!--测试框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.12.RELEASE</version>
<scope>compile</scope>
</dependency>
3、yml 路由配置:
server:
port: ${GAETWAY_PORT_WEB:8001}
spring:
rabbitmq:
host: ${RABBIT_MQ_HOST:127.0.0.1}
port: ${RABBIT_MQ_PORT:5672}
username: ${RABBIT_MQ_USERNAME:test}
password: ${RABBIT_MQ_PASSWORD:123456}
redis:
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
##password: ${REDIS_PASSWORD:}
password: ${REDIS_PASSWORD:123456}
lettuce:
pool:
max-active: 300
zipkin:
enabled: true
sender:
type: rabbit
sleuth:
enabled: true
http:
legacy:
enabled: true
cloud:
gateway:
routes:
- id: im-test
### 这里特别注意 lb加上 哥们测试的时候没有加lb折腾郁闷了###
uri: lb:ws://im-test
predicates:
- Path=/im-test/ws/**
4、nacos bootstrap.yml 配置
spring:
application:
name: gateway-socket
cloud:
nacos:
discovery:
server-addr: ${REGISTER_HOST:127.0.0.1}:${REGISTER_PORT:8848}
config:
server-addr: ${REGISTER_HOST:127.0.0.1}:${REGISTER_PORT:8848}
file-extension: yml
sentinel:
transport:
dashboard: ${SENTINEL_DASHBOARD_HOST:127.0.0.1}:${SENTINEL_DASHBOARD_PORT:8858}
驱动注入配置
5、socket im-test 测试服务
yml 配置
server:
port: 11024
spring:
cloud:
bus:
trace:
enabled: true
rabbitmq:
host: ${RABBIT_MQ_HOST:127.0.0.1}
port: ${RABBIT_MQ_PORT:5672}
username: ${RABBIT_MQ_USERNAME:test}
password: ${RABBIT_MQ_PASSWORD:123456}
zipkin:
enabled: true
sender:
type: rabbit
sleuth:
sampler:
probability: 1.0
mvc:
throw-exception-if-no-handler-found: true
servlet:
multipart:
max-request-size: "100MB"
max-file-size: "100MB"
jackson:
time-zone: GMT+8
bootstrap.yml nacos 配置
spring:
application:
name: im-test
cloud:
nacos:
discovery:
server-addr: ${REGISTER_HOST:127.0.0.1}:${REGISTER_PORT:8848}
config:
server-addr: ${REGISTER_HOST:127.0.0.1}:${REGISTER_PORT:8848}
file-extension: yml
socket注入:
@Configuration
public class Testaa implements WebSocketMessageBrokerConfigurer {
/**
* 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
TestClient 注入
@Slf4j
@ServerEndpoint(value = "/im-test/ws")
@Component
public class TestClient {
/** 记录当前在线连接数 */
private static AtomicInteger onlineCount = new AtomicInteger(0);
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
onlineCount.incrementAndGet(); // 在线数加1
log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
onlineCount.decrementAndGet(); // 在线数减1
log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}
/**
* 收到客户端消息后调用的方法
*
* @param message
* 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
this.sendMessage("Hello, " + message, session);
}
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
/**
* 服务端发送消息给客户端
*/
private void sendMessage(String message, Session toSession) {
try {
log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败:{}", e);
}
}
}
前端测试