一、服务端
- 添加依赖
<properties> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <!--服务端依赖--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- application.properties文件配置
server.port=8761 #实例地址 eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port} #禁止自己作为服务器 eureka.client.register-with-eureka=false #屏蔽注册信息 eureka.client.fetch-registry=false #关闭自我保护 eureka.server.enable-self-preservation=false #关闭“没有用于注册服务器的副本节点”的警告信息 logging.level.com.netflix.eureka=off logging.level.com.netflix.discovery=off
- 启动类加注解
@EnableEurekaServer
@SpringBootApplication //springCloud:注册中心的服务端 @EnableEurekaServer public class Springcloud01Application { public static void main(String[] args) { SpringApplication.run(Springcloud01Application.class, args); } }
二、客户端
- 添加依赖
<properties> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.2.2.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- application.properties文件配置
server.port=8085 # redis数据库配置 spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.application.name=requestCityData-eureka-feign #Eureka客户端配置 eureka.client.service-url.defaultZone=http://localhost:8761/eureka
- 启动类加注解
@EnableEurekaClient
三、消费者调用提供者提供的数据
- 添加依赖
在消费者项目中加入依赖<!--feign 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- application.properties中添加配置
feign.client.config.feignName.connectTimeout=5000 feign.client.config.feignName.readTimeout=5000
- 启动类加注解
@EnableFeignClients
- 自定义一个接口,不实现类
添加注解:@FeignClient("cityDataProvider-eureka")
,cityDataProvider-eureka
是提供者的客户端名称,如以下例子:
方法使用注解@RequestMapping("/city/getCity")
,调用提供者的controller层的路径@FeignClient("cityDataProvider-eureka") public interface GetCityService { /** * 获取城市信息 */ @RequestMapping("/city/getCity") public List<CityObj> getCity(); }
四、使用网关
把两个提供者的数据集合到一起
-
新建一个spring项目,选择相关依赖:
-
启动类上 加上注解
@EnableZuulProxy
和@EnableEurekaClient
-
配置application.properties文件
server.port=8087 spring.application.name=eureka-client-zuul eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ # 城市 列表 提供者 zuul.routes.city.path=/zuulCity/** zuul.routes.city.serviceId=cityDataProvider-eureka # 从redis数据库取数据的 提供者 zuul.routes.myapi.path=/myApi/** zuul.routes.myapi.serviceId=weatherDataProvider-eureka
-
测试获取数据
使用配置中的路径获取数据
例子:http://127.0.0.1:8087/zuulCity/cityData/cities -
修改显示页面的微服务
新建一个接口,把两个提供者合二为一/** * 使用 zuul 链接zuul */ @FeignClient(value = "eureka-client-zuul") public interface GetCityAndWeather { /** * 获取城市信息 * @return */ @RequestMapping("/zuulCity/city/getCity") //路径要和zull的路径一致 public List<CityObj> getCitiesToZuul(); /** * 根据城市id获取天气信息 * 不是定时存入数据库的 * @param cityId * @return */ @RequestMapping("/myApi/weather/cityId/{cityId}") WeatherResponse getWeatherByCityIdToZuul(@PathVariable("cityId")String cityId); }
-
修改controller层,然后测试
五、熔断器
-
介绍
在微服务架构中多层服务之间会相互调用,如果其中有一层服务故障了,可能会导致一层服务或者多层服务故障,从而导致整个系统故障。这种现象被称为服务雪崩效应。SpringCloud 中的 Hystrix 组件就可以解决此类问题,Hystrix 负责监控服务之间的调用情况,连续多次失败的情况进行熔断保护。
保护的方法就是使用 Fallback,当调用的服务出现故障时,就可以使用 Fallback 方法的返回值;
Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。
-
使用熔断器
导入依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
启动类加注解:
@EnableCircuitBreaker
-
配置文件添加:
feign.hystrix.enabled=true
-
修改 feign 的调用接口
在@FeignClient
注解里面添加内容:fallback = GetCityAndWeatherFallBack.class
,然后定义一个实现该接口的类GetCityAndWeatherFallBack
,在实现类中填充数据数据@FeignClient(value = "eureka-client-zuul",fallback = GetCityAndWeatherFallBack.class)
实现接口类:
public class GetCityAndWeatherFallBack implements GetCityAndWeather { @Override public List<CityObj> getCitiesToZuul() { /** * 可以在这里 创建数据 */ return null; } @Override public WeatherResponse getWeatherByCityIdToZuul(String cityId) { return null; } }
-
把两个提供者的微服务关闭,测试