网关的作用
在没学习网关之前我们的项目搭建框架如图,客户端可以直接访问微服务,真实微服务开发中,不可能是任何人都可以访问所有微服务,就要在访问微服务之前,添加一些过滤和认证授权的功能
网关作用:
- 对用户请求做身份认证、权限校验
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流
服务启动时,创建服务实例,并将服务实例信息注册到Nacos集群
Nacos集群需要Nginx来完成负载均衡获取一个Nacos注册中心
客户端请求通过gageway网关拉取服务实例信息列表,负载均衡机制访问服务
消费者服务调用提供者服务:通过Feign远程调用拉取服务实例信息列表,负载均衡机制访问服务
快速入门
环境
spring-cloud版本:Hoxton.SR10
nacos:2.2.5.RELEASE
创建maven项目
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
这里没有写版本原因:在父类POM中的版本管理中已经限制了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
新建application.yaml配置文件
server: port: 10018 # 网关端口 spring: application: name: gateway # 服务名称 cloud: nacos: server-addr: localhost:80 # nacos地址 gateway: routes: # 网关路由配置 - id: user-service # 路由id,自定义,只要唯一即可 # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址 uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称 predicates: # 路由断言,判断请求是否符合路由规则 - Path=/user/** # 按照路径匹配,只要以/user/开头就符合要求
创建启动类
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
项目整体架构
启动
访问 http://localhost:10018/user/1
注意:
Nacos集群一定要将Nacos服务器全部开启
否则会出现一些错误
服务提供者(userservice)
参照 Nacos注册中心搭建工程的编写user-service
服务消费者(feignorderservice)
创建Maven项目,添加依赖(Nacos注册发现、Feign、Feign支持连接池的客户端)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Nacos 注册发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--Feign远程调用--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--Feign底层的客户端实现 支持连接池--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency> <dependency> <groupId>com.marw</groupId> <artifactId>feign-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
配置信息(application.yaml)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
server:
port: 8080 # 网关端口
spring:
datasource:
url: jdbc:mysql://192.168.223.129:3306/cloud-order?useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: feignorderservice # 服务名称
cloud:
nacos:
discovery:
server-addr: localhost:80 # nacos地址
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
feign:
client:
config:
default:
loggerLevel: Full
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
启动类开启Feign客户端、指定Feign客户端
@SpringBootApplication @MapperScan("com.marw.feign.mapper") @EnableFeignClients(clients = UserClient.class) public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
Feign客户端使用
需要使用Feign-Api
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private UserClient userClient; public Order queryById(Long id){ Order order = orderMapper.findById(id); User user = userClient.findById(order.getUser_Id()); order.setUser(user); return order; } }