springcloud微服务实践:天气数据API微服务的实现

优采云 发布时间: 2022-05-27 20:42

  springcloud微服务实践:天气数据API微服务的实现

  天气数据API 微服务的实现

  天气数据API微服务包含了天气数据查询组件。天气数据查询组件提供了天气数据查询的接口。

  我们的数据已经通过天气数据采集微服务集成到了Redis 存储中,天气数据API微服务只需要从Redis获取数据,而后从接口中暴露出去即可。

  在micro-weather-report应用的基础上,我们将对其进行逐步的拆分,形成一个新的微服务msa-weather-data-server应用。

  

  所需环境

  为了演示本例子,需要采用如下开发环境。

  修改天气数据服务接口及实现

  在com.waylau.spring.cloud. weather.service包下,我们之前已经定义了该应用的天气数据服务接口WeatherDataService。

  public interface WeatherDataService {<br />*★<br />*根据城市ID查询天气数据<br />@param cityId<br />@return <br />WeatherResponse getDataByCityId(String cityId);<br />/**<br />★根据城市名称查询天气数据<br />* @param cityId<br />* Creturn<br />*/<br />Wea therResponse getDataByCityName (String cityName) ;<br />}

  对于该微服务而言,我们并不需要同步天气的业务需求,所以把之前定义的syncDataByCityId方法删除了。

  WeatherDataServicelmpl是对WeatherDataService 接口的实现,也要做出相应的调整,将同步天气的代码逻辑都删除,保留以下代码。

  package com. way1au . spr ing.cloud.weather .service;<br />import java. io. IOException;<br />import org.slf4j . Logger;<br />import org.slf4j. LoggerFactory;<br />import org.springf ramework. beans. factory . annotation.Autowired;<br />import org. springfr amework. data. redis. core. StringRedisTemplate;<br />import org. springf ramework. data. redis.core. ValueOperations;<br />import org. springf ramework. stereotype. Service;<br />import com. fasterxml. jackson.databind. objectMapper;<br />import com. waylau. spring. cloud . weather . vo . Wea therResponse;<br />/**<br />k天气数据服务.<br />@since 1.0.0 2017年10月29日 <br />* @author Way Lau<br />@Service<br />public class WeatherDataServiceImpl implements WeatherDataService {<br />private final static Logger logger = LoggerFactory .getLogger (Weather<br />DataServiceImpl.class) ;<br />@Autowi red<br />private StringRedisTemplate stringRedisTemplate; <br />private final String WEATHER API = "http://wthrcdn. etouch . cn/weather_<br />mini";<br />@Override<br />public WeatherResponse getDa taByCityId(String cityId) {<br />String uri = WEATHER API + "?citykey=" + cityId;<br />return this. doGetWea therData (uri) ;<br />@Override<br />public WeatherResponse getDataByCityName (String cityName) {<br />String uri = WEATHER_ API + "?city=" + cityName ;<br />return this. doGe tWeatherData (uri) ;<br />private WeatherResponse doGetWea therData (String uri)<br />valueOperations ops = this.stringRedisTemplate.<br />opsForValue() ;<br />String key = uri;<br />String strBody = null;<br />/先查缓存,查不到抛出异常<br />if (!this. stringRedisTemplate . hasKey (key)) {<br />logger .error("不存在key "+ key) ;<br />throw new Runt imeException ("没有相应的天气信息") ;<br />} else {<br />logger.info("存在key"+ key + ", value=" + ops.get (key));<br />strBody = ops.get (key) ;<br />}<br />0bj ectMapper mapper = new ObjectMapper () ;<br />WeatherResponse weather = null;<br />try {<br />weather = mapper . readvalue (strBody, WeatherResponse.class) ;<br />} catch (IOException e) {<br />logger . error ("JSON反序列化异常! ",e);<br />throw new RuntimeException ("天气信息解析失败") ;<br />return weather;<br />}<br />}

  其中需要注意的是:

  ●原有的RestTemplate用作REST客户端来进行天气数据的同步,这个类相关的代码都可以删除了;

  ●服务 会先从缓存中进行查询,查不到数据就抛出异常(有可能该城市的天气数据未同步,或者是数据已经过期) ;

  在执行反序列化JSON过程中也可能遭遇异常,同样将异常信息抛出。

  除上述WeatherDataServicelmpl、WeatherDataService 外,其他服务层的代码都可以删除了。

  调整控制层的代码

  除了WeatherController 外,其他控制层的代码都不需要了。

  WeatherController仍然是原有的代码保持不变。

  

  删除配置类、天气数据同步任务和工具类

  配置类RestConfiguration、QuartzConfiguration 及任务类WeatherDataSyncJob、 工具类Xml-

  Builder的代码都可以删除了。

  清理值对象

  值对象我们需要保留解析天气相关的类即可,其他值对象(如City. CityList等)都可以删除了。

  清理前端代码、配置及测试用例

  已经删除的服务接口的相关测试用例自然也是要一并 删除的。

  同时,之前所编写的页面HTML、JS文件也要一并 删除。

  最后,要清理Thymeleaf在application.properties文件中的配置,以及build.gradle文件中的依赖。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线