本文共 3060 字,大约阅读时间需要 10 分钟。
JDK8+
Gradle4+
Redis 3.2.100
Apache HttpClient 4.5.3
Spring Boot Web Starter
Spring Boot Data Redis Starter
新建项目文件夹:
将micro-weather-report
项目中的源码文件复制粘贴到新项目文件夹中: 修改build.gradle
配置,删除HttpClient
、quartz
、thymeleaf
的依赖:
//依赖关系dependencies { //该依赖用于编译阶段 compile('org.springframework.boot:spring-boot-starter-web') //Redis compile('org.springframework.boot:spring-boot-starter-data-redis') //该依赖用于测试阶段 testCompile('org.springframework.boot:spring-boot-starter-test')}
修改com.study.spring.cloud.weather.service
包下的WeatherDataService
类:
package com.study.spring.cloud.weather.service;import com.study.spring.cloud.weather.vo.WeatherResponse;public interface WeatherDataService { //根据城市ID查询天气数据 WeatherResponse getDataByCityId(String cityId); //根据城市名称查询天气数据 WeatherResponse getDataByCityName(String cityName); }
修改com.study.spring.cloud.weather.service
包下的WeatherDataServiceImpl
类:
package com.study.spring.cloud.weather.service;import com.fasterxml.jackson.databind.ObjectMapper;import com.study.spring.cloud.weather.vo.WeatherResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import java.io.IOException;@Servicepublic class WeatherDataServiceImpl implements WeatherDataService { //在应用中添加日志 private final static Logger logger=LoggerFactory.getLogger(WeatherDataService.class); private static final String WEATHER_URI="http://wthrcdn.etouch.cn/weather_mini?"; @Autowired //对redis api的封装 private StringRedisTemplate stringRedisTemplate; @Override public WeatherResponse getDataByCityId(String cityId) { String uri=WEATHER_URI + "citykey=" + cityId; return this.doGetWeather(uri); } @Override public WeatherResponse getDataByCityName(String cityName) { String uri=WEATHER_URI + "city=" + cityName; return this.doGetWeather(uri); } private WeatherResponse doGetWeather(String uri) { String key=uri; String strBody=null; ObjectMapper mapper=new ObjectMapper(); WeatherResponse resp=null; //ValueOperations类可通过get()获取缓存中的数据 ValueOperationsops = stringRedisTemplate.opsForValue(); //先查缓存,缓存有的取缓存中的数据 if(stringRedisTemplate.hasKey(key)){ logger.info("Redis has data"); strBody = ops.get(key); }else{ logger.info("Redis doesn't have data"); //缓存没有,抛出异常 throw new RuntimeException("Doesn't have data!"); } //用json反序列化成我们想要的数据 try { /* * strBody:要解析的参数内容,从respString获取 * WeatherResponse.class:要转成的对象类型 */ resp=mapper.readValue(strBody,WeatherResponse.class); }catch(IOException e) { logger.error("Error!",e); } return resp; }}
前端目录下:
修改application.properties
配置文件,将 #热部署静态文件spring.thymeleaf.cache=false
内容删除
此时src
目录结构如下:
注意一定要先运行Redis
运行应用:
运行结果如下: 访问http://localhost:8080/weather/cityId/101020100
页面: 如果页面显示Doesn't have data!
,可能是由于天气数据采集微服务的同步服务器再redis
中的缓存超过了之前设置的半小时,数据被删除掉了,此时要先运行天气数据采集微服务,再运行天气数据API微服务,就可以了 转载地址:http://tgiwi.baihongyu.com/