Eureka註冊中心
爲什麼需要註冊中心
- 微服務數量衆多,要進行遠程調用就需要知道服務端的ip地址和端口,註冊中心幫助我們管理這些服務的ip和端口。
- 微服務會實時上報自己的狀態,註冊中心統一管理這些微服務的狀態,將存在問題的服務踢出服務列表,客戶端獲取到可用的服務進行調用。
Eureka註冊中心(轉)
Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka提供服務端與客戶端,服務端即是Eureka服務註冊中心,客戶端完成微服務向Eureka服務的註冊與發現。服務端和客戶端均採用Java語言編寫。下圖顯示了Eureka Server與Eureka Client的關係:
- 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);
}
}
- 啓動服務
上圖紅色提示信息:
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返回值爲複雜對象時其類型必須有無參構造函數。