微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。 微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:
服务拆分原则
从拆分目标来说,要做到:
从拆分方式来说,一般包含两种方式:
服务注册
引入 nacos 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置 nacos 地址
spring:
application:
name: item-service # 微服务环境 服务名称
cloud:
nacos:
server-addr: 192.168.10.150:8848
服务发现
服务发现前两步与服务注册一致,需要引入依赖、配置地址。 服务发现
private final DiscoveryClient discoveryClient;
private void handleCartItems(List<CartVO> vos) {
// 根据服务名称,拉取服务的实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("item-server");
ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));
URI uri = serviceInstance.getUri();
}
快速入门
早期的负载均衡使用的是 SpringCloud 中的 Ribbon 现在用的是新版本的 loadbalancer
Feign 会自动调用 loadbalancer 进行负载均衡
引入依赖
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
开启注解 - 加到启动类上
@EnableFeignClients
@SpringBootApplication
public class CartApplication { // 略}
编写 FeignClient
@FeignClient("item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
使用 FeignClient 实现远程调用
private final ItemClient itemClient;
List<ItemDTO> items = itemClient.queryItemByIds(itemIds);
连接池
默认使用的 JDK 的 URLConnection, 不带连接池,性能比较差
OpenFeign 对 Http 请求做了伪装,http 请求依赖其他框架,可以自己选择,包括以下三种:
整合 OKHttp 引入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
开启连接池
feign:
okhttp:
enabled: true # 使用okhttp
最佳实践
常用的解决方案,
解决方案的选择,需要看项目选择的拆分方式。
当定义的 FeignClient 不在 SpringBootApplication 的扫描包范围时,这些 FeignClient 无法使用。有两种解决方式:
@EnableFeignClients(basePackages = "com.matuto.api.clients")
@EnableFeignClients(clients = {UserClient.class})
日志输出
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
要自定义日志级别需要声明一个类型为 Logger.Level 的 Bean,在其中定义日志级别:
public class DefaultFeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
但此时这个Bean并未生效,要想配置某个FeignClient的日志,可以在@FeignClient注解中声明:
@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
如果想要全局配置,让所有 FeianClient 都按照这个日志配置,则需要在 @EnableFeianClients 注解中声明:
@EnableFeignClients(basePackages = "com.hmall.api.clients", defaultConfiguration = DefaultFeignConfig.class)