一個很簡單的SpringCloud項目,集成Feign、Hystrix


Feign的功能:這是個消費者,根據服務注冊在EurekaID去找到該服務,並調用接口
Hystrix的功能:熔斷器,假如A服務需要調用B服務的/cities接口獲取數據,那就在A服務的controller里聲明@HystrixCommand,如果B服務的/cities接口掛了,就返回一個自定義的值

項目結構

[root@node01 cloud]# tree weather/
weather/
├── Application.java    #主程序啟動入口
├── controller
│   ├── CityController.java   #控制路由,比如訪問127.0.0.1:8080/cities, 這里調用cityClient方法
└── service
    └── CityClient.java        #具體方法的實現,這里就具體實現cityClient方法(interface)

Application.java

package com.waylau.spring.cloud.weather;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;  #引入熔斷器
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;   #讓eureka能發現自己
import org.springframework.cloud.netflix.feign.EnableFeignClients;     #引入feign

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients    #聲明這個程序引入FeignClient
@EnableCircuitBreaker  #聲明這個程序引入熔斷器
public class Application {

        public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
        }
}

 

controller/CityController.java

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.waylau.spring.cloud.weather.service.CityClient;  #引用service/CityClient.java

@RestController
public class CityController {
        @Autowired
        private CityClient cityClient;

        @GetMapping("/cities")  #控制路由,比如訪問127.0.0.1:8080/cities
        @HystrixCommand(fallbackMethod="defaultCities") #給另外一個服務設置hystrix熔斷器,並聲明fallbackMethod(回調方法)假如另外一個服務掛了,就調用defaultCities方法 public String listCity() {
                // 通過Feign客戶端來查找
                String body = cityClient.listCity();   #調用service里CityClient.java的cityClient方法,獲取城市數據 return body;                           #返回,訪問127.0.0.1:8080/cities就能返回城市數據
        }

        public String defaultCities() {                
                return "City Data Server is down!";
        }
}

service/CityClient.java(消費者)

用Feign去另一個接口獲取數據

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

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


@FeignClient("msa-weather-city") #msa-weather-city是msa-weather-city服務注冊到eureka的ID,通過這個ID就能訪問到msa-weather-city微服務 public interface CityClient {

        @GetMapping("/cities")    #調用msa-weather-city微服務里的/cities接口
        String listCity();        #調用msa-weather-city微服務里的/cities接口里的listCity()方法
}

application.properties

spring.application.name: micro-weather-eureka-client-feign-hystrix

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

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

 

測試,條件為另一個服務可用時,我們是能調用的

 

 

測試.條件為另一個服務不可以時,我們是不能調用的,所以fallback

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM