Nacos微服务注册管理中心与服务通信

参照springboot-alibaba-ribbon项目学习

E:\Codes\Idea_java_works\apesource\springboot\微服务\springboot_alibaba_ribbon

Nacos 微服务注册中心-discover

Nacos 是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中⼼ + 配置中⼼的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与发现。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--    父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!--    项目基本信息--><groupId>com.ape</groupId><artifactId>springboot_alibaba_demo01</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_alibaba_demo01</name><description>springboot_alibaba_demo01</description><!--    声明为父pom文件--><packaging>pom</packaging><!--    父项目的子模块--><modules><module>shop_common</module><module>shop_user</module><module>shop_product</module><module>shop_order</module></modules><!--    依赖版本锁定--><properties><java.version>8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version><spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version></properties><!--dependencyManagement所包含的坐标,子项目不会直接继承,需要声明才可继承--><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

用来注册和管理微服务。

运行命令startup.cmd -m standalone

使用方法:

  1. 创建好一个微服务项目(父项目与多个子项目)
  2. 在每个子项目pom.xml中导入依赖(注意版本应该与springboot版本一致)
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.1.3.RELEASE</version>
</dependency>
  1. 在配置文件中写端口
spring:application:name: server-order #服务名称datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/yuanjiuyuanexcise?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghainame: rootpassword: 123456cloud: # 配置端口nacos: discovery:server-addr: 127.0.0.1:8848
server:port: 8090

注意:一定是127.0.0.1这个主机号 如果是localhost 后期使用getHost()方法会获得到当前IP地址而不是主机号

如果后期使用Feign或者Ribbon做通信就无所谓

//返回所有叫server-product的服务,是一个List,我们只有一个server-product服务所以直接get(0)
ServiceInstance serviceInstance = discoveryClient.getInstances("server-product").get(0);
String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
  1. 启动类中使用 @EnableDiscoveryClient 注解开启微服务注册
  2. 浏览器输入localhost:8848/nacos 账密都是nacos 进入图形化界面查看
  3. 使用的时候 在启动类装配RestTemplate 这种方法不同服务之间发送的请求路径是写死的
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
  1. 搭配Ribbon来让Nacos自动识别路径 添加 @LoadBalanced 负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}
  1. 在service的实现类内注入Mapper RestTemplate 请求路径直接写服务名即可
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Autowiredprivate OrderMapper mapper;@Autowiredprivate RestTemplate restTemplate;//    先找到Product的信息 然后将信息赋值给Order 查询Product的业务在另一个服务 所以需要用到ribbon与nacos@Overridepublic Order placeOrder(int id) {Product product = restTemplate.getForObject("http://server-product/product/" + id, Product.class);Order order = new Order();order.setPid(product.getPid());order.setNumber(1);order.setUserName("周永康");order.setPPrice(product.getPPrice());order.setPName(product.getPName());order.setUid(1);mapper.insert(order);return order;}
}

Nacos 配置管理中心-config 实现热更新配置文件,无需重启服务器

  1. 导入依赖,与springboot版本一致或者与注册中心版本一致
<!--        nacos 配置坐标-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.3.RELEASE</version>
</dependency>
  1. 添加bootstrap.yaml 不能使⽤原来的application.yml作为配置⽂件,⽽是新建⼀个bootstrap.yml作为配置⽂件 配置⽂件优先级(由⾼到低):

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

# 使用nacos的配置中心,配置文件由nacos管理 我们只需要导入即可  name+active+file-extension
# 优先级  bootstrap.yml > application.properties > yml > yaml
spring:application:name: server-ordercloud:nacos:config: # nacos配置中心server-addr: 127.0.0.1:8848file-extension: yml #文件类型profiles:active: dev # 指定环境
  1. 在nacos中创建配置

执行流程

配置热更新

  1. 在nacos配置管理中心的配置文件上添加 指定配置名称
# 配置热更新
config:appName: order
  1. 在controller代码中添加一个@RefreshScope注解用来热更新
@RestController
@RefreshScope // 用于配置热更新
public class NacosConfigController {@Value("${config.appName}") // 使用逐个注入private String appName;@GetMapping("/nacosconfigname")public String test(){return appName;}
}

测试接口,返回值为order 修改配置管理中心的配置文件appName: order1 返回值为order1

不同微服务共享配置

  1. 将大家冗余的配置代码抽取出来例如数据库
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/yuanjiuyuanexcise?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghainame: rootpassword: 123456
  1. 在本地bootstarp.yml中添加
# 使用nacos的配置中心,配置文件由nacos管理 我们只需要导入即可  name+active+file-extension
# 优先级  bootstrap.yml > application.properties > yml > yaml
spring:application:name: server-ordercloud:nacos:config: # nacos配置中心server-addr: 127.0.0.1:8848file-extension: yml #文件类型shared-configs: server-dataBase.yml #-----------共享的配置文件-----------refreshable-dataids: server-dataBase.yml #-----------对于该配置使用热更新------------#        不同服务之间共享配置profiles:active: dev # 指定环境

Ribbon负载均衡器

负责通信(直接使用服务名即可,不需要ip端口),负载均衡。

  • com.netflix.loadbalancer.RoundRobinRule :以轮询的⽅式进⾏负载均衡 com.netflix.loadbalancer.RandomRule :随机策略
  • com.netflix.loadbalancer.RetryRule :重试策略
  • com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越⾼的被调⽤的可能性越⼤
  • com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最⼩的实例返回
  • com.netflix.loadbalancer.AvailabilityFilteringRule :可⽤过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实⼒中轮询调⽤
  • ZoneAvoidanceRule: 以区域可⽤的服务器为基础进⾏服务器的选择。使⽤Zone对服务器进⾏分类,这个Zone可以理解为⼀个机房、⼀个机架等。⽽后再对Zone内的多个服务做轮询
负载均衡使用场景:当某个服务频繁访问,我们想给这个服务增加一台服务器,在springboot中的做法是下图 端口号命令:-Dserver.port=xxxx

添加一个启动器,用来模拟增加一个服务器

通信
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
负载均衡:使用@LoadBalanced注解 意思是负载均衡 使用负载均衡的方式来通讯
@Bean
//    使用ribbon(用来通信,使用服务名即可识别ip端口)需要用到的注解 负载均衡(以负载均衡的方式通信)
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}

全局配置:使用随机负载只要当前服务发请求,不管发给谁,都使用随机负载

//    ribbon的负载策略 这个是全局随机负载
@Bean
public IRule randomRule(){return new RandomRule();
}

局部配置:当前服务只有给server-product发请求的时候才是随机负载

# ribbon局部随机策略
server-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Feign微服务通信(RESTful风格 http请求) 使用前提:已开启nacos服务

Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它使得调⽤远程服务就像调⽤本 地服务⼀样简单, 只需要创建⼀个接⼝并添加⼀个注解即可。 Nacos很好的兼容了Feign, Feign 默认集了Ribbon, 所以在Nacos下使⽤Fegin默认就实现了负载均衡的效果。

  1. 加⼊Fegin的依赖 版本与sprigboot版本一致
<!--        feign通信坐标-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.1.3.RELEASE</version>
</dependency>
  1. 启动类上添加启用feign通信注解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient // 开启微服务注册
@EnableFeignClients //使用feign通信不需要去声明ribbon负载均衡 默认集成了ribbon
public class ShopOrderApplication {public static void main(String[] args) {SpringApplication.run(ShopOrderApplication.class, args);}
}
  1. 编写一个发送请求的通信接口给Product服务发请求,就创建一个ProductServiceClient接口
package com.ape.shop_order.service;import com.ape.pojo.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** 这个接口用来给Product服务发送请求*/
@FeignClient("server-product")//要通信的服务名
public interface ProductServiceClient {//指定调⽤提供者的哪个⽅法//@FeignClient+@GetMapping就是⼀个完整的请求路径http://server-product/product/{id}@GetMapping("/product/{id}")Product selectById(@PathVariable int id);
}
  1. 依赖注入后直接调用接口中的通信方法
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Autowiredprivate OrderMapper mapper;//    使用通信ProductService接口中的通信方法@Autowiredprivate ProductServiceClient productServiceClient;@Overridepublic Order placeOrder(int id) {//       调用通信方法Product product = productServiceClient.selectById(id);Order order = new Order();order.setPid(id);order.setUserName("周永康");order.setUid(1);order.setNumber(1);order.setPName(product.getPName());order.setPPrice(product.getPPrice());mapper.insert(order);log.info(order.toString());return order;}
}
Feign使⽤优化

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

URLConnection:默认实现,不⽀持连接池

Apache HttpClient :⽀持连接池

OKHttp:⽀持连接池 因此提⾼Feign的性能主要⼿段就是使⽤连接池代替默认的URLConnection 这⾥我们⽤Apache的HttpClient来演示

<!--        feign优化 使用HttpClient支持连接池-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version>
</dependency>

配置文件

# 配置连接池
feign:httpclient:enabled: truemax-connections: 200 #最大连接数max-connections-per-route: 50 #每个路径的最大连接数

Dubbo(PRC) 微服务通信

思想是把服务的对象加载到nacos服务器上,再供其他服务调用,这里的nacos服务器有点 IOC的味道。

使用步骤(分清楚调用者和被调用者,调用者是消费者,被调用者是生产者)

  1. 在公共服务common中定义service层里的接口ProductService这样在Product服务中的service层就不用写ProductService接口了
package com.ape.service;import com.ape.pojo.Product;
import org.springframework.web.bind.annotation.PathVariable;/**实战中,会将所有服务接⼝设计给⼀个叫做api的服务,单独维护,此处就在common服务设置*/
public interface ProductService {Product selectById(int id);
}
  1. 给product服务添加依赖 注意版本与springboot版本要匹配
<!--dubbo-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2.1.2.RELEASE</version>
</dependency>
  1. 添加dubbo配置
# dubbo的配置
dubbo:scan:base-packages: com.ape.shop_product.service.impl  #开启包扫描protocols:dubbo:name: dubbo  #服务协议port: -1 #服务端口 随机端口registry:address: spring-cloud://localhost # 注册中心
  1. 编写service.impl包下的ProductService实现类并且暴露出来 这个@Service是dubbo包提供的
package com.ape.shop_product.service.impl;import com.ape.pojo.Product;
import com.ape.service.ProductService;
import com.ape.shop_product.mapper.ProductMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.dubbo.config.annotation.Service;import javax.annotation.Resource;@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService, IService<Product> {@Resource(name = "productMapper")private ProductMapper mapper;@Overridepublic Product selectById(int id) {return mapper.selectById(id);}
}
  1. 给消费者添加依赖
<!--dubbo-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2.1.2.RELEASE</version>
</dependency>
  1. 给消费者添加配置
dubbo:registry:address: spring-cloud://localhost # 注册中⼼cloud:subscribed-services: server-product #定义的提供者名称
  1. 调用服务
package com.ape.shop_order.service.impl;import com.ape.pojo.Order;
import com.ape.pojo.Product;
import com.ape.service.ProductService;
import com.ape.shop_order.mapper.OrderMapper;
import com.ape.shop_order.service.OrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Autowiredprivate OrderMapper mapper;//dubbo 调用@Referenceprivate ProductService productService;@Overridepublic Order placeOrder(int id) {//       调用通信方法Product product = productService.selectById(id);Order order = new Order();order.setPid(id);order.setUserName("周永康");order.setUid(1);order.setNumber(1);order.setPName(product.getPName());order.setPPrice(product.getPPrice());mapper.insert(order);log.info(order.toString());return order;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java入门:06.Java中的方法--进阶02.03

2 可变参数 方法调用时&#xff0c; 传递的实参数量&#xff0c;是由被调用方法的参数列表数列决定的。 一般来讲&#xff0c;传递的实参数量必须与形参变量数量相同&#xff0c;但是也有一种特殊的参数&#xff0c;允许调用时传递的实参数量是可变&#xff0c;这种参数就称为…

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…

AI 时代的编程革命:如何在挑战中抓住机遇?

AI 发展对软件开发的挑战与机遇&#xff1a;程序员应对策略 随着人工智能&#xff08;AI&#xff09;技术的快速进步&#xff0c;软件开发领域正经历深刻的变革。AI 不仅改变了编程的方式&#xff0c;也对程序员的职业发展产生了重要影响。在这个背景下&#xff0c;我们既看到…

HTML5休闲小游戏《砖块破坏者》源码,引流、刷广告利器

HTML5休闲小游戏《砖块破坏者》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468802.html

Linux:Bash中的命令介绍(简单命令、管道以及命令列表)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 在Bash中&#xff0c;命令执行的方式可以分为简单命令、管道和命令列表组成。这些结构提供了强大的工具&#xff0c;允许用户组合命令并精确控制其执行方式。以下是对这…

2024年【电气试验】找解析及电气试验模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电气试验找解析根据新电气试验考试大纲要求&#xff0c;安全生产模拟考试一点通将电气试验模拟考试试题进行汇编&#xff0c;组成一套电气试验全真模拟考试试题&#xff0c;学员可通过电气试验模拟考试全真模拟&#…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

B/S架构和C/S架构的区别

B/S架构、C/S架构区别 1. B/S架构 1.1 什么是B/S架构 B/S架构的全称为Browser/Server&#xff0c;即浏览器/服务器结构。Browser指的是Web浏览器&#xff0c;极少数事务逻辑在前端实现&#xff0c;但主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装&#xff0c;只需要…

动态内存管理-经典笔试题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目一&#xff1a; 结果&#xff1a;程序崩溃 原因&#xff1a; 1、函数是传值调用&#xff0c;出了函数p不存在&#xff0c;str未改变&#xff0c;依旧为空指针&#xff0c;运行时发…

【CTF Web】CTFShow 版本控制泄露源码2 Writeup(目录扫描+.svn泄漏)

版本控制泄露源码2 10 版本控制很重要&#xff0c;但不要部署到生产环境更重要。 解法 用 dirsearch 扫描。 dirsearch -u https://8d22223d-dc2c-419c-b82d-a1d781eda427.challenge.ctf.show/找到 .svn 仓库。 访问&#xff1a; https://8d22223d-dc2c-419c-b82d-a1d781eda…

ubuntu安装minio

# 下载MinIO的可执行文件 curl -O https://dl.min.io/server/minio/release/linux-amd64/minio # 添加执行权限 chmod x minio # 运行MinIO (需要先创建存储数据和存储存储桶的目录) nohup ./minio server /home/lighthouse/minioDir/data /home/lighthouse/minioDir/bucke…

修复线上问题,又造成了个Bug

项目场景 这是一位朋友给我分享的实际线上问题&#xff0c;看似简单却害了项目再次造出一个bug来。 场景&#xff1a;线上环境中&#xff0c;需要查询某某业务数据&#xff0c;条件是状态&#xff0c;之前产品只要求查两个状态的&#xff0c;但现在让他再多查一个状态的。 自…

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…

Go Convey测试框架入门(go convey gomonkey)

Go Convey测试框架入门 介绍 GoConvey是一款针对Golang的测试框架&#xff0c;可以管理和运行测试用例&#xff0c;同时提供了丰富的断言函数&#xff0c;并支持很多 Web 界面特性。 Golang虽然自带了单元测试功能&#xff0c;并且在GoConvey框架诞生之前也出现了许多第三方测…

OSPF路由原理详解与关键点

目录 一. OSPF简介: 二. OSPF原理描述: 三. OSPF的核心内容: 四. OSPF的邻居关系和邻接 五. LSA在各区域中传播的支持情况 一. OSPF简介: 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&…

技术债务已接管经济

“技术债务”一词通常指软件开发过程中的捷径或次优方法。它表现为设计不良的代码、缺乏文档和过时的组件。虽然正确编写的代码和文档是永恒的&#xff0c;但组件和方法却不是。随着时间的推移&#xff0c;软件及其组件可能会成为技术债务。自 40 年前的 20 世纪 80 年代软件行…

【嵌入式开发之网络编程】TCP端口和UDP端口

目录 网络端口的定义及作用 运输层的作用 运输层的两个主要协议 用户数据报协议UDP (User Datagram Protocol) 传输控制协议TCP (Transmission Control Protocol) 运输层的端口及分类 按照端口号分类 按照协议类型分类 BSD端口 网络端口的定义及作用 在网络技术中…

《通义千问AI落地—下》:WebSocket详解

一、前言 文本源自 微博客 且已获授权,请尊重版权。 《通义千问AI落地——下篇》如约而至。Websocket在这一类引用中,起到前后端通信的作用。因此,本文将介绍websocket在这类应用场景下的配置、使用、注意事项以及ws连接升级为wss连接等;如下图,本站已经使用了wss连接…