微服务实践(五)订单模块搭建
一、创建多模块Maven SpringBoot项目
新建项目过程参考:商品模块搭建
二、集成SpringCloud
集成Nacos
1.在父pom(product-center.pom)声明依赖及版本:
<dependencyManagement>
...
<!--注册中心需要的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-nacos.version}</version>
</dependency>
<!--配置中心需要的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-nacos.version}</version>
</dependency>
<!--openfeign需要的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-starter-feign.version}</version>
</dependency>
...
</dependencyManagement>
2.指定依赖版本属性
<spring-cloud-nacos.version>2.2.0.RELEASE</spring-cloud-nacos.version>
<spring-cloud-starter-feign.version>2.2.0.RELEASE</spring-cloud-starter-feign.version>
3.在子pom(product-center-server.xml)添加 dependency依赖:
<!--注册中心需要的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心需要的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
更多版本对应关系参考:版本说明 Wiki
4.在 bootstrap.yml
中配置 Nacos server 的地址和应用名
spring:
application:
name: order-center-server
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: a506f87b-88c7-4fb9-bea4-c59881e140e8
discovery:
server-addr: 127.0.0.1:8848
namespace: a506f87b-88c7-4fb9-bea4-c59881e140e8
server:
port: 8092
namespace、group不填默认为 public 和DEFAULT_GROUP,这里namespace填上 local对应的namespace ID。 添加好依赖和配置后在应用上添加注解@EnableDiscoveryClient开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
5.启动应用,可以看到打印的注册信息。


6.可以看到服务注册成功,接下来为订单服务新建一条配置信息内容如下:

7.配置内容目前只添加了数据库信息,可根据自己业务需求添加对应的配置。
8.通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${testConfig}")
private String useLocalCache;
@RequestMapping("/get")
public String get() {
return useLocalCache;
}
}
9.访问http://localhost:8091/config/get 可以看到配置进行了刷新。
集成OpenFeign
在order-center-api.pom中引入声明的openfeign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后新建OrderFeign类,接口跟controller层保持一致,
@FeignClient(contextId = "order",name = "order-center-server")
public interface OrderFeign {
@GetMapping("/order/detail")
ResponseResult<OrderResDTO> getById(@RequestParam("id") Long id);
}
@FeignClient 常用属性
属性 | 描述 |
name/value | 填写应用名称,用于服务发现,与nacos对应的application.name一致。 |
url | url一般用于调试,可以手动指定@FeignClient调用的地址 |
decode404 | 当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException |
configuration | Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract |
fallback | 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口 |
fallbackFactory | 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码 |
path | 定义当前FeignClient的统一前缀 |
定义好Feign接口后,客户端就可以引用依赖进行调用了,需要在调用的客户端应用加上@EnableFeignClients注解进行启用。
集成Hystrix
Hystrix 是一个开源的容错框架,它可以在分布式系统中提供弹性和可靠性,可以帮助我们构建更加健壮的分布式系统。主要功能为熔断(break)和降级(fallback)。
降级(fallback)
1.新建降级工厂类,实现FallbackFactory,并覆写降级的时候接口返回的逻辑。
@Component
public class OrderFallbackFactory implements FallbackFactory<OrderFeign> {
@Override
public OrderFeign create(Throwable throwable) {
return new OrderFeign(){
@Override
public ResponseResult<OrderResDTO> getById(Long id) {
ResponseResult result=new ResponseResult();
result.setCode("000");
result.setMsg("请稍后重试");
return result;
}
};
}
}
2.在OrderFeign上添加fallbackFactory = OrderFallbackFactory.class
指定降级工厂。
@FeignClient(contextId = "order",name = "order-center-server",fallbackFactory = OrderFallbackFactory.class)
public interface OrderFeign {
@GetMapping("/order/detail")
ResponseResult<OrderResDTO> getById(@RequestParam("id") Long id);
}
3.如果项目中使用的 Spring Cloud 版本为 Greenwich 及之后的版本,OpenFeign 的 Hystrix 默认是开启的,不需要额外配置,如果使用的是 Greenwich 以前的版本,需要在客户端(也就是调用方)配置文件中添加以下配置开启:
feign:
hystrix:
enabled: true
熔断(break)
熔断是指当服务出现故障或异常时,保护客户端和服务器不会因为异常的情况导致更多的资源浪费。例如,当一个服务的响应时间超过某个阈值时,熔断器会打开,停止对该服务的请求,直到服务恢复正常。
1.在 pom.xml
文件中添加 的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>{version}</version>
</dependency>
2.配置Hystrix熔断策略:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 # 设置超时时间
circuitBreaker:
enabled: true # 开启熔断
requestVolumeThreshold: 10 # 熔断请求阈值
errorThresholdPercentage: 60 # 错误率阈值
sleepWindowInMilliseconds: 5000 # 熔断器开启时间
3.上述配置当 Hystrix 接收到的请求达到 10 个时,会开始监控请求的错误率,如果错误率超过了 60%,就会触发熔断器开启。在熔断器开启的状态下,所有请求都会被拒绝,直到熔断器开启时间达到设定的 5000 毫秒后,熔断器才会进入半开启状态,允许一定数量的请求通过,以测试服务的可用性。如果测试成功,则熔断器会关闭,否则会重新开启。同时,每个请求的执行时间都不能超过 3000 毫秒,否则会触发超时异常。
注意:Hystrix相关依赖和配置写在调用方,它是用于熔断和降级的功能,这些功能通常是由调用方控制和触发的。被调用方可能没有意识到是否需要熔断或降级。
Leave a Reply