一起艳学天气微服务(一)
天气系统,就是api获取地方的天气,把天气显示到前端。一个系统是庞大的,但可以拆分多个单一的小服务。
改造成这样的微服务可以让系统更具可维护性,可扩展性。那如何实现一个简单的微服务呢?
首先我们先找个天气的免费的api服务,https://wx.jdcloud.com/market/datas/26/11065要找的不是阿里云,不是百度云,是京东云。这里提供了两个api
天气预报查询https://way.jd.com/jisuapi/weather
获取城市https://way.jd.com/jisuapi/weather1
天气预报查询接口由极速数据平台所提供,数据专业、标准、极速、稳定,请用户放心使用。
数据简介:全国3000多个省市的天气预报查询,包括实时天气气温、最高最低温度、风级、风力、湿度、气压,穿衣、运动、洗车、感冒、空气污染扩散、紫外线等指数,7天天气、风力、最低最高温度、日出日落时间,未来24小时的时天气、气温,空气质量指数、PM2.5指数、主要污染物等信息。
知道了api后,我们看返回的数据,一般是使用json数据,
{
"code": "10000",
"charge": false,
"msg": "查询成功",
"result": {
"status": "0",
"msg": "ok",
"result": {
"city": "安顺",
"cityid": "111",
"citycode": "101260301",
"date": "2015-12-22",
"week": "星期二",
"weather": "多云",
"temp": "16",
"temphigh": "18",
"templow": "9",
"img": "1",
"humidity": "55",
"pressure": "879",
"windspeed": "14.0",
"winddirect": "南风",
"windpower": "2级",
"updatetime": "2015-12-22 15:37:03",
"index": [
{
"iname": "空调指数",
"ivalue": "较少开启",
"detail": "您将感到很舒适,一般不需要开启空调。"
},
{
"iname": "运动指数",
"ivalue": "较适宜",
"detail": "天气较好,无雨水困扰,较适宜进行各种运动,但因气温较低,在户外运动请注意增减衣物。"
}
],
"aqi": {
"so2": "37",
"so224": "43",
"no2": "24",
"no224": "21",
"co": "0.647",
"co24": "0.675",
"o3": "26",
"o38": "14",
"o324": "30",
"pm10": "30",
"pm1024": "35",
"pm2_5": "23",
"pm2_524": "24",
"iso2": "13",
"ino2": "13",
"ico": "7",
"io3": "9",
"io38": "7",
"ipm10": "35",
"ipm2_5": "35",
"aqi": "35",
"primarypollutant": "PM10",
"quality": "优",
"timepoint": "2015-12-09 16:00:00",
"aqiinfo": {
"level": "一级",
"color": "#00e400",
"affect": "空气质量令人满意,基本无空气污染",
"measure": "各类人群可正常活动" }
},
"daily": [
{
"date": "2015-12-22",
"week": "星期二",
"sunrise": "07:39",
"sunset": "18:09",
"night": {
"weather": "多云",
"templow": "9",
"img": "1",
"winddirect": "无持续风向",
"windpower": "微风" },
"day": {
"weather": "多云",
"temphigh": "18",
"img": "1",
"winddirect": "无持续风向",
"windpower": "微风" }
}
],
"hourly": [
{
"time": "16:00",
"weather": "多云",
"temp": "14",
"img": "1"
},
{
"time": "17:00",
"weather": "多云",
"temp": "13",
"img": "1"
}
]
}
}
}
有了这些数据,我们怎么转为java实体呢?没奶油逐个去写属性吧。这时候我们推荐一个艳辉工具http://47.98.237.162/tool/jsonToJavaBean 前端做得比较简陋,但用途比较强大。想获取源码可以加QQ490647751开通我们艳辉VIP。
自动生成实体后,我们编写逻辑代码
public ScenicResponse getDataByCityName(String json) {
return this.doGetWeatherData(json);
}
private ScenicResponse doGetWeatherData(String json) {
ScenicResponse weather;
try {
weather = (ScenicResponse) _jsonUtil.json2Bean(json, ScenicResponse.class);
} catch (Exception e) {
throw new RuntimeException("天气信息解析失败");
}
return weather;
}
就是把json字符串转为java对象,返回前端,接下来编写控制层
@GetMapping("/cityName/{cityName}")
public ScenicResponse getDataByCityName(@PathVariable("cityName") String cityName) throws Exception {
String url = "https://way.jd.com/jisuapi/weather?city="+cityName+"&appkey="+jdyApi;
JSONObject json = getRequestFromUrl(url);;
System.out.println(json.toString());
return scenicDataService.getDataByCityName(json.toString());
}
简单的RESTful API就实现了。
我们将会以系统分层、服务测试、服务拆分、服务通信、服务注册、服务发现、服务消费、集中配置、日志管理、容器部署、安全防护、自动扩展等方面介绍微服务。源码下载地址:http://47.98.237.162/detail/1/165