Spring Cloud 云架构下的微服务架构:部门微服务(Dept)

作者 | springML

来源 | CSDN 博客 责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

封图| CSDN下载于视觉中国 

对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为了清晰可见,创建一套新的微服务架构:部门微服务(Dept)

如果要想进行 SpringCloud 开发,那么一定要对 SpringBoot 有一定的了解,同时本次也将融合 MyBatis 开发技术实现整体的微服务的创建处理。

搭建项目环境

对于现在的项目创建一个:microcloud 的整体父 pom 项目,那么随后为了方便管理,将创建其三个子模块:

  • microcloud-api 模块,作为公共的信息导入配置模块;

  • microcloud-provider-dept-8001:作为服务提供者,该提供者负责使用 Mybatis 与数据库交互;

  • microcloud-consumer-80:作为微服务调用的客户端使用。

1.1 创建一个新的 maven 项目:microcloud;

1.2 【microcloud】修改 pom.xml 文件,主要追加 springcloud 与 springboot 两个开发包的依赖关系;

<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><groupId>cn.study</groupId><artifactId>microcloud</artifactId><version>0.0.1</version><packaging>pom</packaging><name>microcloud</name><url>http://maven.apache.org</url><properties><jdk.version>1.8</jdk.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency>    <!-- 进行SpringCloud依赖包的导入处理 --><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency><dependency>    <!-- SpringCloud离不开SpringBoot,所以必须要配置此依赖包 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.4.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><finalName>microcloud</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${jdk.version}</source><!-- 源代码使用的开发版本 --><target>${jdk.version}</target><!-- 需要生成的目标class文件的编译版本 --><encode>${project.build.sourceEncoding}</encode></configuration></plugin></plugins></build>
</project>

1)【microcloud-api】建立一个 api 的公共模块,该模块的主要功能是提供有公共处理类,本次预计建立一个 Dept 数据表,里面的字段:deptno(Long)、dname(String)、loc(保存的数据库的名字);

package cn.study.vo;import java.io.Serializable;@SuppressWarnings("serial")
public class Dept implements Serializable {private Long deptno ;private String dname ;private String loc ;public Long getDeptno() {return deptno;}public void setDeptno(Long deptno) {this.deptno = deptno;}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}@Overridepublic String toString() {return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc+ "]";}
}

3、 创建一个 Rest 提供者的【microcloud-provider-dept-8001】项目模块,在这个模块里面主要定义要使用的数据库脚本:

DROP DATABASE IF EXISTS "study8001" ;
CREATE DATABASE study8001 CHARACTER SET UTF8 ;
USE study8001 ;
CREATE TABLE dept (deptno        BIGINT        AUTO_INCREMENT ,dname        VARCHAR(50) ,loc            VARCHAR(50) ,CONSTRAINT pk_deptno PRIMARY KEY(deptno)
) ;
INSERT INTO dept(dname,loc) VALUES ('开发部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('财务部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('市场部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('后勤部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('公关部',database()) ;

由于在整个微服务里面需要进行负载均衡的操作,所以本次在使用的时候加入了数据库的名称信息。

创建 Dept 微服务

所谓的微服务的核心本质就是 JSON 的传输,那么既然现在要求使用 MyBatis 进行数据库操作,所以应该在项目里面配置 Druid 数据库连接池,而后对外进行项目的发布。

1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加相关的依赖程序支持包:

    <dependencies><dependency><groupId>cn.study</groupId><artifactId>microcloud-api</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</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</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies>

2、 【microcloud-provider-dept-8001】创建一个 IDeptDAO 数据操作接口,这个接口里面将提供有三个数据操作方法:

package cn.study.microcloud.dao;import java.util.List;import org.apache.ibatis.annotations.Mapper;import cn.study.vo.Dept;
@Mapper
public interface IDeptDAO {public boolean doCreate(Dept vo) ;public Dept findById(Long id) ;public List<Dept> findAll() ;
}

3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 mybatis 和服务的相关配置信息:

server:port: 8001
mybatis:config-location: classpath:mybatis/mybatis.cfg.xml    # mybatis配置文件所在路径type-aliases-package: cn.study.vo            # 定义所有操作类的别名所在包mapper-locations:                                     # 所有的mapper映射文件- classpath:mybatis/mapper/**/*.xml
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource    # 配置当前要使用的数据源的操作类型driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驱动程序类url: jdbc:mysql://localhost:3306/study8001           # 数据库连接地址username: root                                  # 数据库用户名password: mysqladmin                            # 数据库连接密码dbcp2:                                          # 进行数据库连接池的配置min-idle: 5                                   # 数据库连接池的最小维持连接数    initial-size: 5                               # 初始化提供的连接数max-total: 5                                  # 最大的连接数max-wait-millis: 200                          # 等待连接获取的最大超时时间

4、 【microcloud-provider-dept-8001】定义 src/main/resources/mybatis/mybatis.cfg.xml 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 进行Mybatis的相应的环境的属性定义 --><settings>    <!-- 在本项目之中开启二级缓存 --><setting name="cacheEnabled" value="true"/></settings>
</configuration>

5、 【microcloud-provider-dept-8001】修改 src/main/resources/mybatis/mapper/cn/mldn/Dept.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.study.microcloud.dao.IDeptDAO"><select id="findById" resultType="Dept" parameterType="long">SELECT deptno,dname,loc FROM dept WHERE deptno=#{deptno} ;</select><select id="findAll" resultType="Dept">SELECT deptno,dname,loc FROM dept ;</select><insert id="doCreate" parameterType="Dept">INSERT INTO dept(dname,loc) VALUES (#{dname},database()) ;</insert>
</mapper> 

6、 【microcloud-provider-dept-8001】建立 IDeptService 接口,做业务实现:

package cn.study.microcloud.service;import java.util.List;import cn.study.vo.Dept;public interface IDeptService {public Dept get(long id) ;public boolean add(Dept dept) ;public List<Dept> list() ;
}
package cn.study.microcloud.service.impl;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;import cn.study.microcloud.dao.IDeptDAO;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@Service
public class DeptServiceImpl implements IDeptService {@Resourceprivate IDeptDAO deptDAO ;@Overridepublic Dept get(long id) {return this.deptDAO.findById(id);}@Overridepublic boolean add(Dept dept) {return this.deptDAO.doCreate(dept);}@Overridepublic List<Dept> list() {return this.deptDAO.findAll();}}

7、 【microcloud-provider-dept-8001】定义程序的运行主类

package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Dept_8001_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);}
}

8、 【microcloud-provider-dept-8001】进行业务接口测试编写:

package cn.study.test;import static org.junit.Assert.fail;import javax.annotation.Resource;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;import cn.study.microcloud.Dept_8001_StartSpringCloudApplication;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@SpringBootTest(classes = Dept_8001_StartSpringCloudApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class IDeptServiceTest {@Resourceprivate IDeptService deptService ;@Testpublic void testGet() {System.out.println(this.deptService.get(1));}@Testpublic void testAdd() {Dept dept = new Dept() ;dept.setDname("测试部-" + System.currentTimeMillis());System.out.println(this.deptService.add(dept)); }@Testpublic void testList() {System.out.println(this.deptService.list());}}

9、 【microcloud-provider-dept-8001】建立Restful的DeptRest 服务类:

package cn.study.microcloud.rest;import javax.annotation.Resource;import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;@RestController
public class DeptRest {@Resourceprivate IDeptService deptService ;@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)public Object get(@PathVariable("id") long id) {return this.deptService.get(id) ;}@RequestMapping(value="/dept/add",method=RequestMethod.GET)public Object add(@RequestBody Dept dept) {return this.deptService.add(dept) ;}@RequestMapping(value="/dept/list",method=RequestMethod.GET)public Object list() {return this.deptService.list() ;}
}

10、 修改 hosts 配置文件,追加一个映射路径(路径:C:\Windows\System32\drivers\etc\hosts)。

127.0.0.1 dept-8001.com

11、 观察 Rest 服务能否正常提供:

· 调用 get 操作:dept-8001.com:8001/dept/get/1;

· 调用 list 操作:dept-8001.com:8001/dept/list;

客户端调用微服务

1、 创建一个 Maven 的新的模块:microcloud-consumer-80;

2、 【microcloud-consumer-80】修改 application.yml 配置文件:

server:port: 80

3、 【microcloud-consumer-80】创建一个 Rest 的配置程序类,主要进行 RestTemplate 类对象创建,这里很重要,编写这个类然后在控制器里面使用@Resource注解注入以后控制器就可以调用其他微服务了

package cn.study.microcloud.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate() ;}
}

4、 【microcloud-consumer-80】创建一个控制器,为了简化处理,本次不再进行页面定义了,所有服务结果都使用 Rest 返回;

package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://dept-8001.com:8001/dept/get/";public static final String DEPT_LIST_URL = "http://dept-8001.com:8001/dept/list/";public static final String DEPT_ADD_URL = "http://dept-8001.com:8001/dept/add";//使用@Resource注解注入RestTemplate以后控制器就可以调用其他微服务了@Resourceprivate RestTemplate restTemplate;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {Dept dept = this.restTemplate.getForObject(DEPT_GET_URL + id,Dept.class);return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {List<Dept> allDepts = this.restTemplate.getForObject(DEPT_LIST_URL,List.class); return allDepts;}@RequestMapping(value = "/consumer/dept/add")public Object addDept(Dept dept) {Boolean flag = this.restTemplate.postForObject(DEPT_ADD_URL, dept,Boolean.class);return flag;}
}

5、 【microcloud-consumer-80】编写启动程序类

package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Consumer_80_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,args);}
}

6、 修改 hosts 配置文件,追加访问控制路径:

127.0.0.1 client.com

7、 进行代码测试调用:

调用数据返回:

http://client.com/consumer/dept/get?id=1;

测试列表数据:

http://client.com/consumer/dept/list;

测试数据增加:

http://client.com/consumer/dept/add?dname=WEB 测试

感兴趣的开发者小伙伴都可以尝试一下这个方法,或许能让你找到一些新的灵感。也可以在评论区和我们一起讨论你的想法~

本文由作者首发于 CSDN 博客,原文链接:

https://blog.csdn.net/springML/article/details/88039134?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task-blog-blog_SOBAIDUEND-9

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!

推荐阅读:小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
你知道吗?其实 Oracle 直方图自动统计算法存在这些缺陷!(附验证步骤)
详解以太坊虚拟机(EVM)的数据存储机制
比特币当赎金,WannaRen 勒索病毒二度来袭!平台抗住日访问量 7 亿次,研发品控流程全公开“手把手撕LeetCode题目,扒各种算法套路的裤子”北京四环堵车引发的智能交通大构想从Ngin到Pandownload,程序员如何避免面向监狱编程?
真香,朕在看了!

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

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

相关文章

并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期&#xff0c;该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解&#xff0c;以帮助大家构建完整的性能压测的理论体系&#xff0c;并提供有例可依的实战。 该系列专…

Akka in Schedulerx2.0

1. 前言 Schedulerx2.0是阿里中间件自研的基于akka架构的新一代分布式任务调度平台&#xff0c;提供定时、任务编排、分布式跑批等功能&#xff0c;具有高可靠、海量任务、秒级调度等能力。 本篇文章以Schedulerx2.0为例子&#xff0c;介绍akka的应用场景&#xff0c;希望能给…

java.sql.SQLException: The server time zone value ‘???ú±ê×??±??‘ is unrecognized or represents more

【报错信息】 【百度翻译】 服务器时区值???????无法识别或表示多个时区。如果要利用时区支持&#xff0c;必须配置服务器或JDBC驱动程序&#xff08;通过ServerTimeZone配置属性&#xff09;&#xff0c;以使用更具体的时区值 【解决方法】 数据库连接配置conf.xml(…

【从入门到放弃-Java】并发编程-锁-synchronized

简介 上篇【从入门到放弃-Java】并发编程-线程安全中&#xff0c;我们了解到&#xff0c;可以通过加锁机制来保护共享对象&#xff0c;来实现线程安全。 synchronized是java提供的一种内置的锁机制。通过synchronized关键字同步代码块。线程在进入同步代码块之前会自动获得锁…

Redis 学习之一招击穿自己的系统,附送 N 个击穿解决大礼包 | 原力计划

作者 | Mark_MMXI来源 | CSDN博客&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;缓存的存在是为了在高并发情形下&#xff0c;缓解DB压力&#xff0c;提高业务系统体验。业务系统访问数据&#xff0c;先去缓存中进行查询&#xff0c;假如缓存存在数据…

阿里巴巴王坚:用数据来改变世界

“传统信息化建设都是从无到有&#xff0c;加了杆子和机器&#xff0c;但是新一代数字建设就是从有到无&#xff0c;缴费的机器没有了&#xff0c;你回家缴&#xff0c;杆子没有了&#xff0c;你回家缴。” 7月21日&#xff0c;阿里巴巴技术委员会主席王坚在2019年中国电子政务…

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度&#xff0c;通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要写一段 rest-api 的代码&#xff0c;并且还要能够区分不同的版本。下面…

在生产环境中使用 Sentinel

文章目录一、安装zookeeper1. linux环境2. windows环境2. 安装并启动zkui二、编译打包2.1. 拉取项目2.2. 启动2.3. 登录 sentinel2.4. 登录zkui2.5. 重启Sentinel2.6. 删除Sentinel的流控规则三、将客户端和zk打通3.1. 引入依赖3.2. 配置3.3. 启动springboot3.4. sentinel控制台…

JavaScript-浏览器控制台使用

基本语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- JavaScript 严格区分大小写 --><script>// 1. 定义变量 变量类型 变量名 变量值var num 1;num …

看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...

作者| liuhehe123来源| CSDN博客 责编| Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;封图| CSDN下载于视觉中国 无论是已经接触过 Kafka 还是刚入坑的小伙伴&#xff0c;都应该时不时回头了解一下 Kafka &#xff0c;有时候会有不少新收获。今天这份…

Alibaba Cloud Linux 2 开源后又有什么新动作?

阿里妹导读&#xff1a;2019 年 4 月&#xff0c;Alibaba Cloud Linux 2 (Aliyun Linux 2) 正式开源。时至今日&#xff0c;已经走过三个月的里程。在这段时间内&#xff0c;这个刚诞生不久的为阿里云 ECS 环境定制优化的 Linux 操作系统发行版的装机量稳步上升。本文将重点介绍…

一站式数据采集存储的利器:阿里云InfluxDB®️数据采集服务

背景 随着时序数据的飞速增长&#xff0c;时序数据库不仅需要解决系统的稳定性和性能问题&#xff0c;还需实现数据从采集到分析的链路打通&#xff0c;才能让时序数据真正产生价值。在时序数据采集领域&#xff0c;一直缺少自动化的采集工具。虽然用户可以使用一些开源的采集…

Serverless 风起云涌,为什么阿里、微软、AWS 纷纷拥抱开源 OAM?

作者 | 张磊&#xff0c;阿里云原生应用平台高级技术专家邓洪超&#xff0c;阿里云技术专家责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Serverless 这个词第一次被是 2012 年一篇名为《Why The Future of Software and …

K8S从懵圈到熟练 - 我们为什么会删除不了集群的命名空间?

阿里云售后技术团队的同学&#xff0c;每天都在处理各式各样千奇百怪的线上问题。常见的有&#xff0c;网络连接失败&#xff0c;服务器宕机&#xff0c;性能不达标&#xff0c;请求响应慢等。但如果要评选&#xff0c;什么问题看起来微不足道事实上却足以让人绞尽脑汁&#xf…

为什么技术人一定要懂点“可信计算”?

阿里妹导读&#xff1a;可信计算&#xff08;TrustedComputing&#xff0c;简称TC&#xff09;是一项由TCG(可信计算组)推动和开发的技术。可信的核心目标之一是保证系统和应用的完整性&#xff0c;从而确定系统或软件运行在设计目标期望的可信状态。可信和安全是相辅相成的&am…

很用心的为你写了 9 道 MySQL 面试题,建议收藏!

来源 | Java 建设者责编| Carol封图| CSDN下载于视觉中国 MySQL 也是作者本人正在学习的部分&#xff0c;后面会多输出 MySQL 的文章贡献给大家&#xff0c;毕竟 MySQL 涉及到数据存储、锁、磁盘寻道、分页等操作系统概念&#xff0c;而且互联网对 MySQL 的注重程度是不言而喻的…

OpenTelemetry-可观察性的新时代

有幸在2019KubeCon上海站听到Steve Flanders关于OpenTelemetry的演讲&#xff0c;之前Ops领域两个网红项目OpenTracing和OpenCensus终于走到了一起&#xff0c;可观察性统一的标准化已经扬帆起航。 这篇文章旨在抛砖引玉&#xff0c;希望能够和更多的同学一起交流可观察性相关的…

JavaScript-严格检查模式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--前提&#xff1a; IDEA需要设置支持ES6 语法use strict; 必须写在JavaScript 的第一行严格检查模式&#xff0c;预防JavaS…

我们为什么需要 SpringBoot?

作者 | 阿文&#xff0c;责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;任何先进技术的产生都不是凭空出现的&#xff0c;SpringBoot 也不例外&#xff0c;SpringBoot 是基于Spring 的基础上产生的。总所周知&#xff0c;Spri…

高德网络定位之“移动WiFi识别”

导读 随着时代的发展&#xff0c;近10年来位置产业蓬勃发展&#xff0c;定位能力逐渐从低精度走向高精度&#xff0c;从部分场景走向泛在定位。设备和场景的丰富&#xff0c;使得定位技术和能力也不断的优化更新。定位能力包括GNSS、DR&#xff08;航迹推算&#xff09;、MM&a…