SpringCloud hystrix模組的問題與改進,檢視監控介面的使用(五)
阿新 • • 發佈:2019-01-12
springcloud學習總結
5、服務降級,檢視監控介面的使用
一、問題的提出
我們可以看到,在服務提供者方進行服務熔斷之後,一旦呼叫服務方法失敗並丟擲了錯誤資訊後,會自動呼叫@HystrixCommand標註好的fallbackMethod呼叫類中的指定方法。這就使得每一個服務處理的方法都得有一個fallbackMethod方法來處理報錯之後,需要返回的資訊。從而使我們的服務處理類(Controller)變得龐雜而臃腫。怎麼解決這個辦法呢?
二、問題的解決
我麼可以看到,在provider方採取的服務熔斷會使得專案程式碼變得臃腫。從而轉變思路: 在consumer方來採取熔斷機制! 即----服務降級。他是客戶端,與服務端沒有關係
修改api模組,新增類實現FallbackFactory介面,來處理服務呼叫失敗後需要返回的資訊。
package com.atguigu.springcloud.service;
import java.util.List;
import org.springframework.stereotype.Component;
import com.atguigu.springcloud.entities.Dept;
import feign.hystrix.FallbackFactory;
@Component // 不要忘記新增,不要忘記新增 大坑!!!!!!
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
@Override
public DeptClientService create(Throwable throwable)
{
return new DeptClientService() {
@Override
public Dept get(long id)
{
return new Dept().setDeptno(id).setDname("該ID:" + id + "沒有沒有對應的資訊,Consumer客戶端提供的降級資訊,此刻服務Provider已經關閉" )
.setDb_source("no this database in MySQL");
}
@Override
public List<Dept> list()
{
return null;
}
@Override
public boolean add(Dept dept)
{
return false;
}
};
}
}
注意 @Component 不要忘記新增,不要忘記新增 大坑!!!!!!
修改DeptClientService
package com.atguigu.springcloud.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.atguigu.springcloud.entities.Dept;
/**
*
* @Description: 修改microservicecloud-api工程,根據已經有的DeptClientService介面
新建
一個實現了FallbackFactory介面的類DeptClientServiceFallbackFactory
* @date 2018年4月21日
*/
//@FeignClient(value = "MICROSERVICECLOUD-DEPT")
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}
啟動三個註冊中心,兩個提供者與feign模組,測試結果
http://localhost:80/consumer/dept/get/{id}
必要說明:在feign模組的application.yml裡面這段程式碼
feign:
hystrix:
enabled: true
為開啟服務降級。
在系統資源不夠的情況下,關閉某些不重要的、訪問量少的服務,而將大量的資源讓給高訪問的服務。
三、服務監控的使用
新建dashboard模組
pom
<dependencies>
<!-- 自己定義的api -->
<dependency>
<groupId>springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Ribbon相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- feign相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- hystrix和 hystrix-dashboard相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 9001
主啟動類
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer_DashBoard_App.class, args);
}
}
修改feign模組
pom增加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
主啟動類增加註解@EnableCircuitBreaker
啟動註冊中心,服務提供者與帶熔斷機制的消費者80,啟動dashboard訪問連線檢視效果
下圖為監控80模組的截圖
後續:路由閘道器的設定…