SpringCloud---RPC框架OpenFeign的使用

一、基本概念梳理

       微服務架構上,都是採用Restful風格進行通信的。

1、IPC

       進程間通信,Inter-Process Communication指至少兩個進程或線程間傳送數據或信號的一些技術或方法。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。爲了能使不同的進程互相訪問資源並進行協調工作,就有了進程間通信。這些進程可以運行在同一計算機上或網絡連接的不同計算機上。


2、LPC

       本地過程調用,使得同時運行的任務能互相會話。這些任務共享內存空間使任務同步和互相發送信息。


3、RPC

       遠程過程調用,本地機器和遠程機器的進程進行通信。






二、OpenFeign的快速使用

1、父工程加配置

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


2、會員微服務相關代碼及配置

Service層:

	public interface MemberService {
	    @GetMapping("/getUser")
	    String getUser(Integer userId);
	}


	@RestController
	public class MemberServiceImpl implements MemberService {
	    @Value("${server.port}")
	    private String port;
	
	    @Override
	    public String getUser(Integer userId) {
	        return "生產者調用牛逼" + port;
	    }
	}

配置文件:

	spring:
	  application:
	    name: member-producer
	  cloud:
	    nacos:
	      discovery:
	        server-addr: 127.0.0.1:8848
	server:
	  port: 8081

3、消費者微服務相關代碼及配置

OpenFeign接口代碼:

	@FeignClient("member-producer")		//希望調用的微服務名稱
	public interface MemberOpenFeign {
	    @GetMapping("/getUser")			//希望調用的微服務的路徑
	    String getUser(@RequestParam("userId") Integer id);
	}

Service代碼:

	@RestController
	public class OrderService {
	    @Autowired
	    private MemberOpenFeign memberOpenFeign;
	
	    @GetMapping("orderToMember")
	    public String orderToMember() {
	        String result = memberOpenFeign.getUser(222);
	        return result;
	    }
	}

配置文件:

	spring:
	  application:
	    name: order-consumer
	  cloud:
	    nacos:
	      discovery:
	        server-addr: 127.0.0.1:8848
	
	server:
	  port: 9090



4、啓動類加註解

	@SpringBootApplication
	@EnableFeignClients
	public class ConsumerApplication {
	    public static void main(String[] args) {
	        SpringApplication.run(ConsumerApplication.class);
	    }
	}



5、測試使用OpenFeign進行RPC的遠程調用

Alt






三、高級用法

1、調用超時控制

生產者的Service方法那裏故意睡他個2秒。

	@RestController
	public class MemberServiceImpl implements MemberService {
	    @Value("${server.port}")
	    private String port;
	
	    @Override
	    public String getUser(Integer userId) {
	        String result = "生產者調用牛逼" + port;
	        try {
	            Thread.sleep(2000);
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	        return result;
	    }
	}

訪問直接報錯。

Alt

去控制檯查看錯誤。

Alt

       訪問報了錯,因爲OpenFeign默認等待時間是一秒鐘,會員服務線程直接睡了兩秒,那RPC調用肯定超時了。


       解決方法,可以在消費者配置文件中增加下面的配置提高容錯性(OpenFeign自帶Ribbon負載均衡)。感覺寫的有點反人類(ribbon具體配置後面會講,這裏如果最前面沒有帶上服務名稱的話,默認是全局的)。。。

	ribbon:
	  ConnectTimeout: 4000  #指的是和服務器建立連接後讀取資源的最大連接時間
	  ReadTimeout: 5000 #指的是和服務器建立連接的最大等待時間

       再次訪問就成功了。

Alt


2、調用異常返回

需要整合Sentinel才能實現該功能,配置文件添加下面配置:

	feign:
	  sentinel:
	    enabled: true

so esay。實現之前OpenFeign的接口,返回數據。

	public class MemberFallbackService implements MemberOpenFeign {
	    @Override
	    public String getUser(Integer id) {
	        return "會員服務發生異常";
	    }
	}

並且在之前的接口上增加屬性fallback。
@FeignClient(value = "member-producer", fallback= MemberFallbackService.class)


停止生產者服務,測試RPC遠程調用自定義異常成功。

Alt



3、日誌打印

       …實測,以下配置對於Cloud版本爲Hoxton.SR4也就是最新版根本沒調用好吧。

	feign:
	  client:
	    config:
	      member-producer:
	        loggerLevel: full

       要想打印RPC遠程調用的日誌,還是得靠SpringBoot自帶的AOP日誌工具logger。加上下面的配置。

	logging:
	  level:
	    com.cj.cn.service.order.openfeign.MemberOpenFeign: debug

       當然你還可以通過java代碼控制顯示的日誌級別。

	public class FeignClientConfiguration {
	    @Bean
	    public Logger.Level feignLoggerLevel() {
	        return Logger.Level.FULL;
	    }
	}

加入到接口屬性裏。@FeignClient(value = "member-producer", configuration = FeignClientConfiguration.class)


       測試。

Alt


下階段打算整理Ribbon系列。

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