SpringCloud学习之旅09--weather项目collection-eureka-feign

目录结构:


该项目是通过上篇博文获取的cityId去获取该城市的天气情况。

build.gradle文件:

// buildscript 代码块中脚本优先执行
buildscript {


// ext 用于定义动态属性
ext {
springBootVersion = '2.0.0.M3'
}


// 使用了Maven的中央仓库及Spring自己的仓库(也可以指定其他仓库)
repositories {
// mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
}


// 依赖关系
dependencies {


// classpath 声明了在执行其余的脚本时,ClassLoader 可以使用这些依赖项
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}


// 使用插件
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'


// 指定了生成的编译文件的版本,默认是打成了 jar 包
group = 'com.waylau.spring.cloud'
version = '1.0.0'


// 指定编译 .java 文件的 JDK 版本
sourceCompatibility = 1.8


// 使用了Maven的中央仓库及Spring自己的仓库(也可以指定其他仓库)
repositories {
//mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
}


ext {
springCloudVersion = 'Finchley.M2'
}


// 依赖关系
dependencies {


// 该依赖用于编译阶段
compile('org.springframework.boot:spring-boot-starter-web')


// HttpClient
compile('org.apache.httpcomponents:httpclient:4.5.3')


// Redis
compile('org.springframework.boot:spring-boot-starter-data-redis')


// Quartz
compile('org.springframework.boot:spring-boot-starter-quartz')


// Eureka Client
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')


// Feign
//compile('org.springframework.cloud:spring-cloud-starter-openfeign')

// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '1.4.4.RELEASE'


// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign', version: '1.0.3.RELEASE'


// 该依赖用于测试阶段
testCompile('org.springframework.boot:spring-boot-starter-test')
}


dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}

}



application.properties文件:

spring.application.name: msa-weather-collection-eureka-feign


eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/


feign.client.config.feignName.connectTimeout: 5000
feign.client.config.feignName.readTimeout: 5000


server.port=8016





package com.waylau.spring.cloud.weather.vo;


/**
 * City.
 * 
 * @since 1.0.0 2017年11月23日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
public class City {
private String cityId;

private String cityName;

private String cityCode;

private String province;


public String getCityId() {
return cityId;
}


public void setCityId(String cityId) {
this.cityId = cityId;
}


public String getCityName() {
return cityName;
}


public void setCityName(String cityName) {
this.cityName = cityName;
}


public String getCityCode() {
return cityCode;
}


public void setCityCode(String cityCode) {
this.cityCode = cityCode;
}


public String getProvince() {
return province;
}


public void setProvince(String province) {
this.province = province;
}

}




package com.waylau.spring.cloud.weather.service;


import java.util.List;


import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;


import com.waylau.spring.cloud.weather.vo.City;


/**
 * City Client.
 * 
 * @since 1.0.0 2017年11月28日
 * @author <a href="https://waylau.com">Way Lau</a> 

 */

//这是注册到eureka的另外一个服务

@FeignClient("msa-weather-city-eureka")
public interface CityClient {

@GetMapping("/cities")
List<City> listCity() throws Exception;

}



package com.waylau.spring.cloud.weather.service;


/**
 * Weather Data Collection Service.
 * 
 * @since 1.0.0 2017年11月26日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
public interface WeatherDataCollectionService {


/**
* 根据城市ID同步天气
* @param cityId
*/
void syncDateByCityId(String cityId);

}






package com.waylau.spring.cloud.weather.service;


import java.util.concurrent.TimeUnit;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


/**
 * Weather Data Collection Service.
 * 
 * @since 1.0.0 2017年11月26日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
@Service
public class WeatherDataCollectionServiceImpl implements WeatherDataCollectionService {
private static final String WEATHER_URI = "http://wthrcdn.etouch.cn/weather_mini?";


private static final long TIME_OUT = 1800L; // 1800s

@Autowired
private RestTemplate restTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

@Override
public void syncDateByCityId(String cityId) {
String uri = WEATHER_URI + "citykey=" + cityId;
this.saveWeatherData(uri);
}

/**
* 把天气数据放在缓存
* @param uri
*/
private void saveWeatherData(String uri) {
String key = uri;
String strBody = null;
ValueOperations<String, String>  ops = stringRedisTemplate.opsForValue();


// 调用服务接口来获取
  ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);


  if (respString.getStatusCodeValue() == 200) {
strBody = respString.getBody();
}

// 数据写入缓存
ops.set(key, strBody, TIME_OUT, TimeUnit.SECONDS);


}

}







package com.waylau.spring.cloud.weather.config;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;


/**
 * Rest Configuration.
 * 
 * @since 1.0.0 2017年11月22日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
@Configuration
public class RestConfiguration {

@Autowired
private RestTemplateBuilder builder;


@Bean
public RestTemplate restTemplate() {
return builder.build();
}

}





package com.waylau.spring.cloud.weather.config;


import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import com.waylau.spring.cloud.weather.job.WeatherDataSyncJob;


/**
 * Quartz Configuration.
 * 
 * @since 1.0.0 2017年11月23日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
@Configuration
public class QuartzConfiguration {


private static final int TIME = 1800; // 更新频率  s


// JobDetail
@Bean
public JobDetail weatherDataSyncJobDetail() {
return JobBuilder.newJob(WeatherDataSyncJob.class).withIdentity("weatherDataSyncJob")
.storeDurably().build();
}

// Trigger
@Bean
public Trigger weatherDataSyncTrigger() {

SimpleScheduleBuilder schedBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(TIME).repeatForever();

return TriggerBuilder.newTrigger().forJob(weatherDataSyncJobDetail())
.withIdentity("weatherDataSyncTrigger").withSchedule(schedBuilder).build();
}

}



package com.waylau.spring.cloud.weather.job;


import java.util.List;


import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;


import com.waylau.spring.cloud.weather.service.CityClient;
import com.waylau.spring.cloud.weather.service.WeatherDataCollectionService;
import com.waylau.spring.cloud.weather.vo.City;


/**
 * Weather Data Sync Job.
 * 
 * @since 1.0.0 2017年11月23日
 * @author <a href="https://waylau.com">Way Lau</a> 
 */
public class WeatherDataSyncJob extends QuartzJobBean {

private final static Logger logger = LoggerFactory.getLogger(WeatherDataSyncJob.class);  


@Autowired
private WeatherDataCollectionService weatherDataCollectionService;


@Autowired
private CityClient cityClient;

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.info("Weather Data Sync Job. Start!");
// 获取城市ID列表
List<City> cityList = null;

try {

// 由城市数据API微服务提供数据
cityList = cityClient.listCity();
} catch (Exception e) {
logger.error("Exception!", e);
}

// 遍历城市ID获取天气
for (City city : cityList) {
String cityId = city.getCityId();
logger.info("Weather Data Sync Job, cityId:" + cityId);

weatherDataCollectionService.syncDateByCityId(cityId);
}

logger.info("Weather Data Sync Job. End!");
}


}



这里就把根据cityId获取天气的信息服务注册到了eureka服务中去了。

该博文是根据cityId获取天气的信息将信息存入Redis缓存中。



猜你喜欢

转载自blog.csdn.net/qq_33371766/article/details/80660318