SpringBoot搭建天气预报微服务系统
SpringBoot搭建天气预报微服务系统
前言
本系列文章将简单的学习SpringCloud微服务相关知识,其实也是因为时间的原因,一直拖到现在,遂打算趁着假期,决定记录下来。
从天气预报微服务系统的单体架构——>分布式架构的演变过程中,一步一步,由浅及深的学习SpringCloud微服务的思想与其实现的组件。
本系列文章分为以下几个章节:
- SpringBoot搭建天气预报微服务系统(单体架构)
- SpringBoot集成Redis缓存
- SpringBoot集成Quartz定时框架
- SpringBoot结合Thymeleaf模板与Bootstrap快速搭建界面
- 单体架构到微服务架构的拆分
- SpringCloud微服务组件—Eureka服务注册与发现
- SpringCloud微服务组件—Feign负载均衡与高可用
- SpringCloud微服务组件—Zuul实现API网关分配
- SpringCloud微服务组件—Config集中实现配置管理
- SpringCloud微服务组件—Hystrix服务熔断机制
项目源码已上传至Github.
开发环境
- JDK 1.8
- IDEA 2017.3
- Gradle 4
- HttpClient 4.5.3
- SpringBoot 2.0.0.RELEASE
//依赖关系
dependencies {//该依赖用于编译阶段compile('org.springframework.boot:spring-boot-starter-web')//HttpClientcompile('org.apache.httpcomponents:httpclient:4.5.3')//该依赖用于测试阶段testCompile('org.springframework.boot:spring-boot-starter-test')
}
开发需求
天气预报项目的功能特别简单。即用户可以通过城市名称查询对应的城市天气。
关于天气预报数据的来源
我们使用网上免费的第三方天气API服务提供商。当然对于的缺点就是不稳定,随时可能挂掉,但是足以应付我们的开发学习。
开发过程
项目结构
从返回JSON数据建立对应的实体类
我们利用Postman发送天气请求。
http://wthrcdn.etouch.cn/weather_mini?citykey=101280101
- 1
返回数据如下(部分):
{"data": {"yesterday": {"date": "27日星期五","high": "高温 26℃","fx": "无持续风向","low": "低温 22℃","fl": "<![CDATA[<3级]]>","type": "阵雨"},"city": "广州","aqi": "77","forecast": [{"date": "28日星期六","high": "高温 26℃","fengli": "<![CDATA[<3级]]>","low": "低温 21℃","fengxiang": "无持续风向","type": "阵雨"},{"date": "29日星期天","high": "高温 27℃","fengli": "<![CDATA[<3级]]>","low": "低温 23℃","fengxiang": "无持续风向","type": "阵雨"}],"ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。","wendu": "24"},"status": 1000,"desc": "OK"
}
可以很容易的发现,可以建立四个实体类。
- Forecast
private String date;private String high;private String fengli;private String low;private String fengxiang;private String type;
- Weather
private Yesterday yesterday;private String city;private String aqi;private List<Forecast> forecast;private String ganmao;private String wendu;
- WeatherResponse
private Weather data;private Integer status;private String desc;
- Yesterday
private String date;private String high;private String fx;private String low;private String fl;private String type;
建立天气预报系统API
对于系统,我们只提供两个请求方式。
- 根据城市ID查询天气 /cityId/{cityId}
- 根据城市名称查询天气 /cityName/{cityName}
WeatherDataService
/*** @Author: cfx* @Description: 天气数据接口* @Date: Created in 2018/4/5 10:38*/
public interface WeatherDataService {/*** 根据城市Id查询天气* @param cityId* @return*/WeatherResponse getDataByCityId(String cityId);/*** 根据城市名称查询天气* @param cityName* @return*/WeatherResponse getDataByCityName(String cityName);
}
WeatherDataServiceImpl
@Service
public class WeatherDataServiceImpl implements WeatherDataService {private static final String WEATHER_URI = "http://wthrcdn.etouch.cn/weather_mini?";@Autowiredprivate RestTemplate restTemplate;@Overridepublic WeatherResponse getDataByCityId(String cityId) {String uri = WEATHER_URI + "citykey=" + cityId;return this.doGetWeather(uri);}@Overridepublic WeatherResponse getDataByCityName(String cityName) {String uri = WEATHER_URI + "city=" + cityName;return this.doGetWeather(uri);}/*** 重构代码* @param uri* @return*/private WeatherResponse doGetWeather(String uri) {ResponseEntity<String> respString = restTemplate.getForEntity(uri,String.class);//将接口返回的Json字符串转换成对象ObjectMapper mapper = new ObjectMapper();WeatherResponse resp = null;String strBody = null;if (respString.getStatusCodeValue() == 200) {strBody = respString.getBody();}try {resp = mapper.readValue(strBody,WeatherResponse.class);} catch (IOException e) {e.printStackTrace();}return resp;}}
视图控制层
WeatherController
@RestController
@RequestMapping("/weather")
public class WeatherController {@Autowiredprivate WeatherDataService weatherDataService;@GetMapping("/cityId/{cityId}")public WeatherResponse getWeatherByCityId(@PathVariable("cityId") String cityId) {return weatherDataService.getDataByCityId(cityId);}@GetMapping("/cityName/{cityName}")public WeatherResponse getWeatherByCityName(@PathVariable("cityName") String cityName) {return weatherDataService.getDataByCityName(cityName);}
}
RestTemplate模板配置
@Configuration
public class RestConfiguration {//启动的时候要注意,由于我们在controller中注入了RestTemplate,所以启动的时候需要实例化该类的一个实例@Autowiredprivate RestTemplateBuilder builder;@Beanpublic RestTemplate restTemplate() {return builder.build();}
}
运行
输入http://localhost:8080/weather/cityId/101280601
运行。
至此,基于SpringBoot的单体结构的天气预报系统大体就完成了,后面还会基于此加入Redis和Quartz来提高系统性能
SpringBoot搭建天气预报微服务系统相关推荐
- ssh改造springboot微服务系统改造升级步骤及注意事项(一)
ssh改造springboot微服务系统改造升级步骤及注意事项(一) 本次系统改造是以目前市场较为前沿.主流的技术为标准进行改造.为了达到系统性能的提升.实现高并发.高可用以及增强系统可扩展性等目的. ...
- 快速搭建 SpringCloud 微服务开发环境的脚手架
快速搭建 SpringCloud 微服务开发环境的脚手架 本文作者:HelloGitHub-秦人 本文适合有 SpringBoot 和 SpringCloud 基础知识的人群,跟着本文可使用和快速搭建 ...
- 商城项目02_环境搭建、安装VAGRANT、DOCKER、MYSQL、REDIS、从0搭建各个微服务项目、数据库初始化、安装NGINX
文章目录 ①. virtualBox - 管理虚拟机 ②. vagrant - 安装虚拟机 ③. 虚拟机安装 - docker ④. docker上安装mysql ⑤. docker上安装redis ...
- Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...
- 《深入理解 Spring Cloud 与微服务构建》第十八章 使用 Spring Security OAuth2 和 JWT 保护微服务系统
<深入理解 Spring Cloud 与微服务构建>第十八章 使用 Spring Security OAuth2 和 JWT 保护微服务系统 文章目录 <深入理解 Spring Cl ...
- 《深入理解 Spring Cloud 与微服务构建》第十七章 使用 Spring Cloud OAuth2 保护微服务系统
<深入理解 Spring Cloud 与微服务构建>第十七章 使用 Spring Cloud OAuth2 保护微服务系统 文章目录 <深入理解 Spring Cloud 与微服务构 ...
- 创建微服务架构的步骤_如何快速搭建一个微服务架构?
原标题:如何快速搭建一个微服务架构? 微服务火了很久,但网上很少有文章能做到成熟地将技术传播出来,同时完美地照顾"初入微服务领域人员",从 0 开始,采用通俗易懂的语言去讲解微服务 ...
- 快速正确的搭建一个微服务架构需要了解的那几个点
原文:https://my.oschina.net/u/3636867/blog/1803023 作者:烂猪皮 一.微服务架构四大特性 好的微服务架构是什么样的呢?想要搭建好一个微服务架构,必须要具备 ...
- No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)
代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...
最新文章
- RCP开发小技巧(二)
- java同步机制:synchronized
- 从“连锁”到“新联锁”,尚美生活如何引领酒店行业变革?
- myeclipse设置注释格式
- 后台获取html控件的值
- PHP+ExtJS 文件上传示例
- Weblogic 12c中修改SERVER NAME的方法
- 算法 --- 二叉树的最大深度
- 迅雷使用积分制的真正作用和目的 [揭密迅雷]
- Python基础—10-常用模块:time,calendar,datetime
- ASP.NET Core 2.0身份和角色管理入门
- s7300plc串口通信_西门子PLC300串口通信协议比较与分析
- TestNG介绍 - 1
- Hive(三)——数据定义
- CentOS6.6下搭建vsftpd+PAM认证
- win10使用命令提示符启用/关闭远程桌面
- matlab实现移位寄存器,Matlab移位寄存器的实现
- Microsoft Visio 2016 专业版
- Android那些你可能没了解过的---碎片化
- JS跟APP交互——H5调用原生APP的方法
热门文章
- poll接口《来自Linux驱动程序开发实例》
- STM32--MPU内存保护单元(二)
- 彻底学会Spring事务——概念+具体实现
- java eclipse profile_在 Eclipse 中集成JProfiler 进行 JAVA 项目性能分析
- 基于socket的C语言编程,C语言实现的Socket编程
- mysql外建名是随机的吗_创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL...
- python online json editor_JSON Editor 中文文档
- html 的layer的属性,layer属性
- 使用maven-war-plugin 打包时排除不需要的文件
- [19/06/07-星期五] CSS基础_布局定位背景样式