SpringCloud組件Eureka+Feign

Eureka註冊中心


爲什麼需要註冊中心

  • 微服務數量衆多,要進行遠程調用就需要知道服務端的ip地址和端口,註冊中心幫助我們管理這些服務的ip和端口。
  • 微服務會實時上報自己的狀態,註冊中心統一管理這些微服務的狀態,將存在問題的服務踢出服務列表,客戶端獲取到可用的服務進行調用。

Eureka註冊中心(轉)

Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka提供服務端與客戶端,服務端即是Eureka服務註冊中心,客戶端完成微服務向Eureka服務的註冊與發現。服務端和客戶端均採用Java語言編寫。下圖顯示了Eureka Server與Eureka Client的關係:
Eureka

  • Eureka Server是服務端,負責管理各各微服務結點的信息和狀態。
  • 在微服務上部署Eureka Client程序,遠程訪問Eureka Server將自己註冊在Eureka Server。
  • 微服務需要調用另一個微服務時從Eureka Server中獲取服務調用地址,進行遠程調用。

Eureka Server搭建

  • 導入依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Finchley.SR1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--導入Eureka服務的依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.0.1.RELEASE</version>
</dependency>
  • 配置文件
server:
  port: 50101 #服務端口
spring:
  application:
    name: cosin-eureka-server #指定服務名
eureka:
  client:
    registerWithEureka: false #服務註冊,是否將自己註冊到Eureka服務中
    fetchRegistry: false #服務發現,是否從Eureka中獲取註冊信息
    serviceUrl: #Eureka客戶端與Eureka服務端的交互地址,高可用狀態配置對方的地址,單機狀態配置自己(如果不配置則默認本機8761端口)
      defaultZone: http://localhost:50101/eureka/
  server:
    enable-self-preservation: false #是否開啓自我保護模式
    eviction-interval-timer-in-ms: 60000 #服務註冊表清理間隔(單位毫秒,默認是60*1000)
  • springboot的啓動類
@SpringBootApplication
@EnableEurekaServer//標識eureka服務
public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class,args);
    }
}
  • 啓動服務
    Eureka

上圖紅色提示信息:
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF
NETWORK/OTHER PROBLEMS.
自我保護模式被關閉。在網絡或其他問題的情況下可能不會保護實例失效。

  • 注:高可用環境,Eureka Server 高可用環境需要部署兩個Eureka server,它們互相向對方註冊。

Feign遠程調用


Feign介紹(轉)

Feign是Netflix公司開源的輕量級rest客戶端,使用Feign可以非常方便的實現Http 客戶端。Spring Cloud引入Feign並且集成了Ribbon實現客戶端負載均衡調用。

服務提供者搭建

  • 依賴
<!-- 導入Eureka客戶端的依賴 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  • 配置
server:
  port: 8882
spring:
  application:
    name: provicer
eureka:
  client:
    registerWithEureka: true #服務註冊開關
    fetchRegistry: true #服務發現開關
    serviceUrl: #Eureka客戶端與Eureka服務端進行交互的地址,多箇中間用逗號分隔
      defaultZone: http://localhost:50101/eureka/
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1
    instance-id: ${spring.application.name}:${server.port} #指定實例id
  • 測試接口
@RequestMapping("api/")
@RestController
public class ProviderService {

    @RequestMapping("hello")
    public String hello(){
        System.out.println("服務被調用");
        return "hello";
    }
}
  • 啓動類
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}
  • 啓動兩個服務
    服務

服務調用

  • 依賴
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<dependencies>
  • 配置
eureka:
  client:
    registerWithEureka: false #服務註冊開關
    fetchRegistry: true #服務發現開關
    serviceUrl: #Eureka客戶端與Eureka服務端進行交互的地址,多箇中間用逗號分隔
      defaultZone: http://localhost:50101/eureka/
  instance:
    prefer-ip-address:  false  #將自己的ip地址註冊到Eureka服務中
  • 接口調用
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "PROVICER")//服務名
public interface RemoteConsumer {

    @GetMapping("/api/hello")//需要調用方法的路由
    String demo();
}
  • 啓動類
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}
  • 調用測試
    調用測試

Feign工作原理如下:

  • 啓動類添加@EnableFeignClients註解,Spring會掃描標記了@FeignClient註解的接口,並生成此接口的代理對象。
  • @FeignClient(value = “PROVICER”)即指定了服務名稱,Feign會從註冊中心獲取服務列表,並通過Feign集成的Ribbon負載均衡算法進行服務調用。
  • 在接口方法 中使用註解@GetMapping(“路由”),指定調用的url,Feign將根據url進行遠程調用。

注:Feign注意點

SpringCloud對Feign進行了增強兼容了SpringMVC的註解 ,我們在使用SpringMVC的註解時需要注意:

  • feignClient接口 有參數在參數必須加@PathVariable(“XXX”)和@RequestParam(“XXX”)
  • feignClient返回值爲複雜對象時其類型必須有無參構造函數。

demo地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章