# spring-cloud-study **Repository Path**: gitee_lw/spring-cloud-study ## Basic Information - **Project Name**: spring-cloud-study - **Description**: 学习spring cloud - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-26 - **Last Updated**: 2024-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## nacos windows 启动 nacos服务 在安装的bin目录cmd 执行:startup.cmd -m standalone 访问:http://localhost:8848/nacos ## mongodb @Document 是用来标识一个类对应 MongoDB 中的一个文档,通常用在类的定义上。这个注解有两个属性,value 和 collection,用来指定操作的数据库和集合名称。通过该注解,可以将一个 Java 类与一个 MongoDB 文档建立映射关系。 @Id 是用来标识一个成员变量或方法作为 MongoDB 文档的 _id 属性。该注解可以应用于 Java 对象中的一个成员变量或者 getter 方法上。如果在类中没有标注 @Id 注解,则 MongoDB 会自动为该文档生成一个 _id 属性。标注了 @Id 注解的成员变量或方法必须为 String、ObjectId 或 BigInteger 类型。 @Field 是用来标识一个成员变量或方法对应 MongoDB 文档中的一个key-value对。这个注解有两个属性,name 和 value,可以用来指定在文档中 key 的名称。如果没有指定 name 属性,则默认使用成员变量名作为 key 的名称。该注解可以应用于 Java 对象中的一个成员变量或者 getter 方法上。 @Transient 是用来指定一个成员变量不参与MongoDB 文档的序列化。这个注解可以应用于 Java 对象中的一个成员变量或者 getter 方法上。被标注了 @Transient 注解的成员变量或方法不会保存到数据库中。 ## webSocket ```java /* 原始WebSocket服务器类 对于带有@ServerEndpoint注解的WebSocket服务类WebsocketServer,即使添加了@Service注解, 也不能像普通Spring Bean那样直接通过@Autowired注解在其他Spring Bean中注入使用。 因为@ServerEndpoint是由Java WebSocket API规范管理的,它的实例生命周期不由Spring容器控制。 所以下面我们创建了一个代理类WebSocketProxyService,别的地方注入代理类使用即可 */ @Service @ServerEndpoint("/myws/{username}/{roomId}") public class WebsocketServer { // 存储WebSocket连接的集合,这里仅作演示,实际可能需要更复杂的管理机制 private static final Map sessions = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session, @PathParam("username") String username, @PathParam("roomId") String roomId) { sessions.put(generateKey(username, roomId), session); } // 提供给代理类调用的方法,用于向指定用户和房间发送消息 public void sendMessageToUserAndRoom(String username, String roomId, String message) { Session session = sessions.get(generateKey(username, roomId)); if (session != null) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { // 处理发送失败情况 } } } // 私有辅助方法,生成键值 private String generateKey(String username, String roomId) { return username + "_" + roomId; } } // WebSocket服务代理类,由Spring管理 @Service public class WebSocketProxyService { // 直接持有WebSocketServer的实例,注意这里不再是通过Spring注入,而是直接实例化 private final WebsocketServer websocketServer = new WebsocketServer(); // 提供给业务层调用的方法 public void notifyFrontend(String username, String roomId, String message) { websocketServer.sendMessageToUserAndRoom(username, roomId, message); } } // 示例:在业务实现层调用WebSocket服务代理 @Service public class SomeBusinessService { /* 在Spring框架中,不仅可以注入接口,还可以注入实现了接口的具体类,甚至可以直接注入普通的类(无需实现接口)。 Spring IoC容器能够管理所有被标记为@Component、@Service、@Repository、@Controller等注解的类。 当你通过@Autowired注解将这些类注入到另一个类中时,Spring会自动创建并初始化这些类的实例。 */ @Autowired private WebSocketProxyService webSocketProxyService; public void onDataChange(DataChangeEvent event) { // 数据变化逻辑... // 通知前端 webSocketProxyService.notifyFrontend(event.getUsername(), event.getRoomId(), "Data has been updated"); } } ``` ## 微服务打包 1.所有没有子模块的模块 pom文件需要加上 `jar`,否则加上`pom` 2.根模块加上如下配置 ```html org.springframework.boot spring-boot-maven-plugin 3.1.6 org.apache.maven.plugins maven-surefire-plugin 3.0.0 true org.apache.maven.plugins maven-compiler-plugin 3.1 17 17 ``` 3.所有包含启动类的模块加上如下配置 ```html org.springframework.boot spring-boot-maven-plugin 3.1.6 com.example.gateway.GatewayApplication ZIP repackage org.apache.maven.plugins maven-compiler-plugin 3.1 17 17 ``` 4.在根模块执行maven打包。但这样还是有问题,可能是非启动类模块不能包含`starter`相关依赖 ## 微服务部署 docker-compose编排`nacos`部署报错,暂时没有找到解决办法。