第一篇:SpringCloud 构建微服务系统之服务注册和发现(consul)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/85260629

今天我们要学习的是consul在soringcloud中的使用。首先学习consul之前,我们应该看看consul的官网,对它有一个初步的认识。

1. consul 官网 (https://www.consul.io)

在这里插入图片描述

2. consul 简介

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

3.consul基本概念

  • client

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。

  • server

SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

  • server-leader

中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

  • raft

server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。

  • 服务发现协议

consul采用http和dns协议,etcd只支持http

  • 服务注册

consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。

  • 服务发现

consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。

  • 服务间的通信协议

Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。

4.consul架构图

在这里插入图片描述

5.Consul常用命令

5.1 agent 运行一个consul agent

consul agent -dev

5.2 join 将agent加入到consul集群

consul join IP

5.3 members 列出consul cluster的members

consul members

5.4 leave 将节点移除所在集群

consul leave

6.consul安装和启动

在这里插入图片描述

点击“download”下载:使用命令启动

 consul agent -dev

启动成功之后在地址:http://localhost:8500在这里插入图片描述

7.consul服务的发现与注册

7.1 注册服务

使用HTTP API 注册个服务,使用[接口API](https://www.consul.io/api/agent/service.html API)调用

调用 http://localhost:8500/v1/agent/service/register PUT 注册一个服务。request body:

{"ID": "userServiceId", //服务id"Name": "userService", //服务名"Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务"primary","v1"],"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP"Port": 9000,          //服务注册consul的PORT,发现的就是这个PORT"EnableTagOverride": false,"Check": {             //健康检查部分"DeregisterCriticalServiceAfter": "90m","HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的"Interval": "10s"   //健康检查间隔时间,每隔10s,调用一次上面的URL}
}

使用curl调用

curl http://127.0.0.1:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{"ID": "userServiceId",  "Name": "userService","Tags": ["primary","v1"],"Address": "127.0.0.1","Port": 8000,"EnableTagOverride": false,"Check": {"DeregisterCriticalServiceAfter": "90m","HTTP": "http://www.baidu.com","Interval": "10s"}
}'

结果

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   288    0     0  100   288      0  18000 --:--:-- --:--:-- --:--:-- 18000HTTP/1.1 200 OK
Vary: Accept-Encoding
Date: Wed, 26 Dec 2018 05:11:32 GMT
Content-Length: 0

在这里插入图片描述

7.2 发现个服务

刚刚注册了名为userService的服务,我们现在发现(查询)下这个服务

curl http://127.0.0.1:8500/v1/catalog/service/userService

返回的响应:

 curl http://127.0.0.1:8500/v1/catalog/service/userService% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   891  100   891    0     0  28741      0 --:--:-- --:--:-- --:--:-- 28741[{"ID": "9b831a00-ae68-d575-5e51-df193897b834","Node": "vip-PC","Address": "127.0.0.1","Datacenter": "dc1","TaggedAddresses": {"lan": "127.0.0.1","wan": "127.0.0.1"},"NodeMeta": {"consul-network-segment": ""},"ServiceKind": "","ServiceID": "userServiceId","ServiceName": "userService","ServiceTags": ["primary","v1"],"ServiceAddress": "127.0.0.1","ServiceWeights": {"Passing": 1,"Warning": 1},"ServiceMeta": {},"ServicePort": 8000,"ServiceEnableTagOverride": false,"ServiceProxyDestination": "","ServiceProxy": {},"ServiceConnect": {},"CreateIndex": 88,"ModifyIndex": 88}
]

基本的服务发现和注册我们已经弄清楚了。接下来我来看看Spring Cloud 整合consul的使用。

8. consul服务提供者

8.1创建一个项目:spring-cloud-consul-provider

引入依赖

<?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 http://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.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lidong</groupId><artifactId>spring-cloud-consul-producer</artifactId><version>1.0.0</version><name>spring-cloud-consul-producer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RC2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></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><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository></repositories></project>

对配置文件做一个简单的介绍,我们使用的是最新版的springboot2.1.1,springcloud.Greenwich.RC2版本。
其中:

spring-boot-starter-actuator   健康检查依赖于此包。
spring-cloud-starter-consul-discovery   Spring Cloud consul的服务发现支持。

8.2 提供者添加配置(application.yml)

server:port: 9001 #提供者的端口
spring:application:name: spring-cloud-consul-producercloud:consul:host: localhostport: 8500discovery:tags: devserviceName: spring-cloud-consul-producer   # 注册到consul的服务名称healthCheckPath: /actuator/healthhealthCheckInterval: 15shealthCheckUrl: http://127.0.0.1:9001/actuator/healthregister: trueprefer-ip-address: false

consul的地址和端口号默认是127.0.0.1:8500,如果没有配置hosts,默认的地址localhost,consul服务会占用8500端口
server.port :9001 服务的提供者的端口
spring.application.name 是指注册到 consul的服务名称,后期客户端会根据这个名称来进行服务调用。
spring.application.cloud.discovery.discovery.host: localhost
spring.application.cloud.discovery.discovery. port:8500

8.3 修改启动类

添加 @EnableDiscoveryClient 注解,开启服务发现支持。

package com.lidong.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 开启服务发现*/
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudLidongProviderApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudLidongProviderApplication.class, args);}}

8.4新建服务

新建 ConsulProducerController,提供 sayHello 接口, 返回一个hello—>字符串。

package com.lidong.provider.service;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 创建服务*/
@RestController
public class ConsulProducerController {@Value("${server.port}")private Integer port;/*** 服务接口* @param name* @return*/@RequestMapping("/hello")public String sayHello(@RequestParam("name")String name) {return "hello ---> "+name+" port -->"+port;}
}

启动项目:

2018-12-26 13:21:42.984  INFO 20248 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9001 (http) with context path ''
2018-12-26 13:21:42.994  INFO 20248 --- [           main] o.s.c.c.s.ConsulServiceRegistry          : Registering service with consul: NewService{id='spring-cloud-consul-producer-9001', name='spring-cloud-consul-producer', tags=[dev, secure=false], address='vip-PC', meta=null, port=9001, enableTagOverride=null, check=Check{script='null', interval='15s', ttl='null', http='http://127.0.0.1:9001/actuator/health', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null}
2018-12-26 13:21:43.008  INFO 20248 --- [           main] l.p.SpringCloudLidongProviderApplication : Started SpringCloudLidongProviderApplication in 4.09 seconds (JVM running for 4.755)

服务提供者发布成功。
这时候,我们在控制台会发现服务列表中有一个名字为spring-cloud-consul-producer的服务

在这里插入图片描述
点击详情会发现服务的详细信息
在这里插入图片描述

9. Consul服务消费者

9.1创建一个项目:spring-cloud-consul-consumer

引入依赖

<?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 http://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.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lidong</groupId><artifactId>spring-cloud-consul-consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-consul-consumer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RC2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></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><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository></repositories></project>

9.2 消费者添加配置(application.yml)

server:port: 9002 #服务消费者的端口
spring:application:name: spring-cloud-consul-consumercloud:consul:host: localhostport: 8500discovery:tags: devregister: false    #设置不需要注册到 consul 中healthCheckPath: /actuator/healthhealthCheckInterval: 15shealthCheckUrl: http://127.0.0.1:9002/actuator/health

consul的地址和端口号默认是 127.0.0.1:8500,如果没有配置hosts,默认的地址localhost,consul服务会占用8500接口
server.port :9006 服务的消费者的端口
spring.application.cloud.consul.discovery.register: false

9.3配置启动类

package com.lidong.consumer;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsulConsumerApplication {@Autowiredprivate RestTemplateBuilder builder;@LoadBalanced@Bean// 添加负载均衡支持,很简单,只需要在RestTemplate上添加@LoadBalanced注解,那么RestTemplate即具有负载均衡的功能,如果不加@LoadBalanced注解的话,会报java.net.UnknownHostException:springboot-h2异常,此时无法通过注册到Eureka Server上的服务名来调用服务,因为RestTemplate是无法从服务名映射到ip:port的,映射的功能是由LoadBalancerClient来实现的。public RestTemplate restTemplate() {return builder.build();}public static void main(String[] args) {SpringApplication.run(SpringCloudConsulConsumerApplication.class, args);}}

9.4创建消费服务

package com.lidong.consumer.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;/*** 创建服务的消费者*/
@RestController
public class ConsumerController {private static final String SERVICE_NAME = "spring-cloud-consul-producer";@Autowiredprivate DiscoveryClient discoveryClient;/*** 获取所有服务*/@RequestMapping("/services")public Object services() {return discoveryClient.getInstances(SERVICE_NAME);}/*** 消费服务*/@RequestMapping("/callSayHello")public String services(@RequestParam("name") String name) {ServiceInstance serviceInstance = (ServiceInstance) discoveryClient.getInstances(SERVICE_NAME);String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);System.out.println(callServiceResult);return callServiceResult;}
}

http://localhost:9002/services

获取服务列表的结果

[{"instanceId":"spring-cloud-consul-producer-9001","serviceId":"spring-cloud-consul-producer","host":"vip-PC","port":9001,"secure":false,"metadata":{"dev":"dev","secure":"false"},"uri":"http://vip-PC:9001","scheme":null}]

测试请求的url
http://localhost:9002/callSayHello?name=9002
消费的结果

hello ---> 9002 port -->9001

源码地址
https://download.csdn.net/download/u010046908/10877868

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

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

相关文章

2018 年视频监控企业竞争力分析 海康威视连续七年蝉联全球第一

视频监控是安防行业的核心 近年来&#xff0c;随着我国政府对平安城市、" 雪亮工程 " 以及金融和交通运输等领域的重视&#xff0c;对于安防产品的需求不断提升&#xff0c;安防市场规模也在随之不断扩大。视频监控是整个安防系统最重要的物理基础&#xff0c;视频监…

Ambient occlusion

https://en.wikipedia.org/wiki/Ambient_occlusion https://gamedev.stackexchange.com/questions/23/what-is-ambient-occlusion http://people.mpi-inf.mpg.de/~ritschel/Papers/SSDO.pdf 注解&#xff1a; 论文&#xff08;http://people.mpi-inf.mpg.de/~ritschel/Papers/S…

利用RTL2832u电视棒芯片追踪民航飞机轨迹

我国民航飞机通讯的频率为1090Mhz&#xff0c;而rtl2832u电视棒芯片可以接受的频率范围为24 – 1766 MHz&#xff08;通过改制Q通道可以接收0-30Mhz的短波&#xff09;下面开始介绍利用rtl2832u电视棒芯片获取民航航线 第一步淘宝搜索rtl2832u820T(50块钱就能买到) <ignore_…

预见2019:《2019年中国视频监控产业全景图谱》(附产业布局、政策环境、市场规模、发展趋势)

2019-2024年中国视频监控设备行业市场需求预测与投资战略规划分析报告2019-2024年中国安防行业市场前瞻与投资战略规划分析报告2019-2024年中国智能安防行业市场前瞻与投资战略规划分析报告2019-2024年中国智能家居设备行业市场前瞻与投资策略规划报告2019-2024年中国城市轨道交…

终于有人把EMC基础知识总结如此清晰

传导与辐射 电磁干扰(Electromagnetic Interference)&#xff0c;简称EMI&#xff0c;有传导干扰和辐射干扰两种。传导干扰主要是电子设备产生的干扰信号通过导电介质或公共电源线互相产生干扰&#xff1b;辐射干扰是指电子设备产生的干扰信号通过空间耦合把干扰信号传给另一个…

一个go1.9.x 编译器内联引起的栈信息错乱的问题分析

2019独角兽企业重金招聘Python工程师标准>>> 背景是在写个日志库&#xff0c;日志库有个很重要的功能就是要打印出调用栈&#xff0c;知道具体是哪个文件&#xff0c;哪个函数调用的Info 等。 然后在测试中发现了一种写法&#xff0c;我自己本机测试一直ok&#xff…

Learn Python—表达式、数据类型、流程控制

表达式 在 Python 中&#xff0c;2 2 称为“表达式”&#xff0c;它是语言中最基本的编程结构。表达式包含“值”&#xff08;例如2&#xff09;和“操作符”&#xff08;例如&#xff09;&#xff0c;并且总是可以求值&#xff08;也就是归约&#xff09;为单个值。这意味着在…

Python并发编程之concurrent.futures

2019独角兽企业重金招聘Python工程师标准>>> concurrent.futures模块提供了一个异步执行callables的高级接口。 可以使用ThreadPoolExecutor和ProcessPoolExecutor。 两者都继承了相同的接口&#xff0c;该接口由抽象的Executor类定义。 一个抽象类&#xff0c;提供…

移植opencv3.20到3556AV100

1.移植环境&#xff1a; Ubuntu14.04 arm-hisiv200-linux-opencv3.20 下载地址 2.移植步骤&#xff1a; 1&#xff09;安装cmake-gui 2&#xff09;新建一个opencv目录存放opencv-3.2.0.zip&#xff0c;并解压 击Browse Source选择~/hisi/opencv/opencv-3.2.0 点击Brow…

ngnix 详解

4 Nginx的rpm软件包安装 4.1 安装包在位置 D:\讲课内容--\新巴巴运动网\nginx高并发解决\nginx安装包 4.2 此种安装方式不用安装gcc等编译工具 4.3 安装命令如下 rpm –ivh nginx 5 配置虚拟主机 5.1 什么是虚拟主机 虚拟主机是一种特殊的软硬件技术&#xff0c;它可以将网络上…

初谈逻辑读、物理读、预读

前言&#xff1a; 该文并不全是本人原创&#xff0c;里面的某些原理来自于CareySon。 SQL SERVER数据存储的形式 要理解逻辑读、物理读、预读这三个概念&#xff0c;先要搞懂SQL Server的数据存储方式。 SQL Server数据库包括数据文件和日志文件&#xff0c;一个数据库可以有一…

Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

1、生成可执行文件的makefile2、生成静态链接库的makefile3、生成动态链接库的makefile 本文把makefile 分成了三份&#xff1a;生成可执行文件的makefile&#xff0c;生成静态链接库的makefile&#xff0c;生成动态链接库的makefile。 这些makefile都很简单&#xff0c;一般都…

Python数据分析之pandas入门

一、pandas库简介 pandas是一个专门用于数据分析的开源Python库&#xff0c;目前很多使用Python分析数据的专业人员都将pandas作为基础工具来使用。pandas是以Numpy作为基础来设计开发的&#xff0c;Numpy是大量Python数据科学计算库的基础&#xff0c;pandas以此为基础&#x…

激光雷达和毫米波雷达的区别

什么是激光雷达 激光雷达&#xff0c;是以发射激光束探测目标的位置、速度等特征量的雷达系统。其工作原理是向目标发射探测信号&#xff08;激光束&#xff09;&#xff0c;然后将接收到的从目标反射回来的信号&#xff08;目标回波&#xff09;与发射信号进行比较&#xff0c…

Git—使用方法

1、:插件的安装&#xff08;eclipse LUNA版本之后已经自动集成&#xff0c;不需要安装插件&#xff09;、 * 先打开该网页提供了对应版本的EGit&#xff0c;自己选择相应的版本。&#xff08;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F&…

激光雷达与毫米波雷达对比

激光雷达是一种采用非接触激光测距技术的扫描式传感器&#xff0c;其工作原理与一般的雷达系统类似&#xff0c;通过发射激光光束来探测目标&#xff0c;并通过搜集反射回来的光束来形成点云和获取数据&#xff0c;这些数据经光电处理后可生成为精确的三维立体图像。采用这项技…

安全可靠国产系统下的应用怎么搭建?

据国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;统计数据&#xff0c;2016年我国共收录通用软硬件漏洞 10822个&#xff0c;漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁&#xff0c;近年来我国频繁发布信息安全相关政策&a…

Win10 + Python + MXNet + VS2015配置

项目需要使用MTCNN来检测、对齐、剪切出人脸&#xff0c;它是使用MXNet作为框架的&#xff0c;但是我自己的Ubuntu里各种框架乱成一团&#xff0c;不想再添乱就铁了心要在windows里配一个。无奈网上的资料不多&#xff0c;挣扎了几天之后决定留下这么一份文档。 首先我们使用的…

bzoj 3224 Tyvj 1728 普通平衡树

题目大意&#xff1a; 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&#xff0c…

不懂毫米波雷达?5分钟读懂毫米波雷达的那些事儿

2019年是毫米波风生水起的一年&#xff0c;也是毫米波名声大噪的一年。毫米波应用范围广泛&#xff0c;如毫米波雷达、毫米波天线等。而本文&#xff0c;将向大家介绍毫米波雷达&#xff0c;主要内容包括&#xff1a;毫米波雷达原理、毫米波雷达主要特点、毫米波雷达优势以及毫…