SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Feign、Gateway)
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到Orderorder.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-serviceuri: lb://orderservicepredicates:- Path=/order/**
然后启动GatewayApplication
注意到我们的网关没有做任何业务逻辑,但是却能查用户信息,其实这就是把请求从网关路由到了服务。同理访问localhost:10010/order/101