一、基本概念梳理
微服務架構上,都是採用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的遠程調用
三、高級用法
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;
}
}
訪問直接報錯。
去控制檯查看錯誤。
訪問報了錯,因爲OpenFeign默認等待時間是一秒鐘,會員服務線程直接睡了兩秒,那RPC調用肯定超時了。
解決方法,可以在消費者配置文件中增加下面的配置提高容錯性(OpenFeign自帶Ribbon負載均衡)。感覺寫的有點反人類(ribbon具體配置後面會講,這裏如果最前面沒有帶上服務名稱的話,默認是全局的)。。。
ribbon:
ConnectTimeout: 4000 #指的是和服務器建立連接後讀取資源的最大連接時間
ReadTimeout: 5000 #指的是和服務器建立連接的最大等待時間
再次訪問就成功了。
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遠程調用自定義異常成功。
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)
測試。
下階段打算整理Ribbon系列。