http客户端Feign
(一)基于Feign远程调用
1、RestTemplate方式调用存在的问题
2、Feign的介绍
3、定义和使用Feign客户端
这个接口里面将来的封装的就是所有对userservice发起的远程调用
1、orderserivce的pom
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、开启自动装配功能,找到启动类OrderApplication添加注解
3、编写客户端,做接口说明
clients/UserClient接口
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
3、替代之前写的RestTemplate
找到之前orderservice中写的queryOrderById注释掉
4、OrderService中代码改造
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.用Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
测试order/101多次,在IDEA中发现无论是8081还是8082都被调用了多次,说明我们不仅实现了远程调用,还实现了负载均衡
说明Feign内部已经集成了负载均衡的功能
4、总结
(二)自定义配置
(三)性能优化
(四)最佳实践分析
(五)实现Feign最佳实践
统一网关Gateway
(一)网关作用介绍
1、为什么需要网关
2、网关的技术实现
3、总结
(二)快速入门
1、搭建网关服务
创建一个全新的module,做一个独立的服务
因为网关本身也是一个微服务,因此也需要把自己注册到nacos,或者从nacos拉取服务,所以要有服务注册发现依赖
<dependencies>
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
当然我们知道一个服务要想启动还需要main函数,所以我们现在给网关创建一个main函数
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
接下来我们在网关中实现请求的路由
请求路由是通过配置来实现的
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
然后启动GatewayApplication
注意到我们的网关没有做任何业务逻辑,但是却能查用户信息,其实这就是把请求从网关路由到了服务。同理访问localhost:10010/order/101