feign介紹
Feign客戶端是一個web聲明式http遠程調用工具,提供了接口和注解方式進行調用。
?
Spring Cloud 支持 RestTemplate? Fetin
Feign客戶端實際開發中用的最多 ,易讀性比較強。
??
feignclient調用第三方接口,主要調用部分:
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.toov5</groupId><artifactId>order</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><!-- 管理依賴 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- SpringBoot整合Web組件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot整合eureka客戶端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies><!-- 注意: 這里必須要添加, 否者各種依賴有問題 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
</project>
?yml:
###服務啟動端口號
server:port: 8002
###服務名稱(服務注冊到eureka名稱)
spring:application:name: app-toov5-order
###服務注冊到eureka地址
eureka:client:service-url:defaultZone: http://127.0.0.1:8100/eureka###因為該應用為注冊中心,不會注冊自己register-with-eureka: true
###是否需要從eureka上獲取注冊信息fetch-registry: true
Feign
package com.toov5.Feign;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(name="app-toov5-member") //name就是服務名稱 public interface MemberFeign {//Feign書寫方式 以Spring mvc接口形式書寫 @RequestMapping("/getMember") //接口形式 實現是交給Member實現的public String getMember(); //底層自動轉換成http協議實現rpc遠程調用 }
controller
package com.toov5.api.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import com.toov5.Feign.MemberFeign;@RestController public class FeignController {@Autowiredprivate MemberFeign memberFeign;@RequestMapping("/getFeignMember")public String feignMember() {return memberFeign.getMember();} }
feign實現遠程調用原理,啟動類:
package com.toov5;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication(scanBasePackages={"com.toov5.*"}) @EnableEurekaClient @EnableFeignClients //可以開啟feign客戶端權限 public class AppOrder {public static void main(String[] args) {SpringApplication.run(AppOrder.class, args); }//解決RestTemplate找不到問題 把restTemplate注冊到Spring Boot容器中 // @Bean // @LoadBalanced 手寫的 不要去實現本地負載均衡效果了 // RestTemplate restTemplate() { // return new RestTemplate(); // } // }
?
?
Member(不用變) 服務提供者不變
?
? pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.toov5</groupId><artifactId>member</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><!-- 管理依賴 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- SpringBoot整合Web組件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot整合eureka客戶端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies><!-- 注意: 這里必須要添加, 否者各種依賴有問題 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
接口調用工具。 yml:
###服務啟動端口號
server:port: 8009
###服務名稱(服務注冊到eureka名稱)
spring:application:name: app-toov5-member
###服務注冊到eureka地址
eureka:client:service-url:##當前會員注冊到eureka服務 地址+端口號 defaultZone: http://127.0.0.1:8100/eureka###因為該應用為注冊中心,不會注冊自己register-with-eureka: true
###是否需要從eureka上獲取注冊信息fetch-registry: true
controller
package com.toov5.api.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class MemberApiController {@Value("${server.port}")private String serverPort;@RequestMapping("/getMember")public String getMember() {return "會員服務"+serverPort;} }
啟動類
package com.toov5.api;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient //注冊到eureka public class AppMember {public static void main(String[] args) {SpringApplication.run(AppMember.class, args);}}
Eureka
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.toov5</groupId><artifactId>SpringCloud-eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><!-- 管理依賴 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--SpringCloud eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies> <!-- 注意: 這里必須要添加, 否者各種依賴有問題 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
yml:
###eureka 服務端口號
server:port: 8100
###服務注冊名稱
eureka:instance:##注冊中心ip地址hostname: 127.0.0.1
###客戶端調用地址client:serviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
###因為該應用為注冊中心,不會注冊自己 (集群設為true)register-with-eureka: false
###因為自己為注冊中心 ,不會去在該應用中的檢測服務 fetch-registry: false
被調用對象已與客戶端斷開連接。 啟動:
package com.toov5;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer //開啟注冊中心 @SpringBootApplication public class AppEureka {public static void main(String[] args) {SpringApplication.run(AppEureka.class, args);}}
?
?