网关的简单使用
基于前面文章的项目,创建一个网关模 service-gateway
pom.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>top.jiangqiang</groupId> <artifactId>spring-cloud-demo</artifactId> <version>${revision}</version> </parent> <artifactId>service-gateway</artifactId> <name>${project.artifactId}</name> <description>service-gateway</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--服务网关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--必须依赖,因为网关也用到了负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies> </project>
application.yaml文件内容如下:
server: port: 8004 spring: application: name: service-gateway cloud: nacos: username: @nacos.username@ #@***@这种写法表示从pom.xml文件读取配置 password: @nacos.password@ config: file-extension: yaml server-addr: @nacos.server-addr@ #用于管理配置的nacos服务地址 namespace: @nacos.namespace@ #命名空间 discovery: server-addr: @nacos.server-addr@ #服务发现,服务注册中心地址,因为和配置中心使用同一个nacos,所以地址是同一个。 namespace: @nacos.namespace@ gateway: routes: #-表示配置一个结合,子节点都是集合内部对象的属性 - id: nacos-route #随便取一个id,多个路由id之间不能重复 uri: lb://service-provider #lb表示负载均衡,service-provider是服务提供者的spring.application.name predicates: #这里又是一个嵌套的集合 - name: Path args: #args是一个map,前面的-可以加,也可以省略 - pattern: /nacos/** filters: - StripPrefix=1 #去掉/nacos前缀 loadbalancer: #使用 Spring Cloud Alibaba 社区针对 Spring Cloud Loadbalancer 负载均衡依赖提供的负载均衡策略,以便使用 Spring Cloud Alibaba 提供的所有的能力 ribbon: enabled: false nacos: #使用nacos提供的负载均衡,不使用此配置时,默认的负载均衡是轮询 enabled: true config: import: #springboot3必须配置此选项,至少配置一个,可以任意配置,配置后会使用nacos配置中心对应的配置 - optional:nacos:${spring.application.name}.yaml #前面加optional表示可选,允许配置服务器连接不成功时启动服务 - nacos:datasource.yaml?refresh=true #?refresh=true表示配置更新不需要重启即可生效,可以省略 - nacos:common.yaml management: endpoints: web: exposure: include: '*' #允许所有的endpoints访问,此时访问:http://127.0.0.1:8004/actuator/health
大部分配置和前面文章的配置一样,唯独不一样的地方在于:
gateway: routes: #-表示配置一个结合,子节点都是集合内部对象的属性 - id: nacos-route #随便取一个id,多个路由id之间不能重复 uri: lb://service-provider #lb表示负载均衡,service-provider是服务提供者的spring.application.name predicates: #这里又是一个嵌套的集合 - name: Path args: #args是一个map,前面的-可以加,也可以省略 - pattern: /nacos/** filters: - StripPrefix=1 #去掉/nacos前缀
上面配置的作用在于将/nacos/**开头的路径地址转发到service-provider服务中的/**地址。例如我们访问:http://localhost:8004/nacos/getPort 相当于访问到了http://service-provider/getPort,注意:service-provider是指服务提供者的IP和端口号,这里会通过负载均衡自动选择。
可能很多人会觉得这和nginx实现反向代理和负载均衡没啥区别,但事实上,使用网关还可以对服务进行一些通用的权限访问控制,可能很多人听说过开放网关平台,这就是将内部来自不同服务的接口通过网关暴露出去,提供给第三方开发者使用。同时可以在网关上控制外部对接口的调用次数,以及权限认证。
注意:网关是将内部服务暴露出去给外部开发者使用,所以系统内部服务之间不应该通过网关访问,因为会有性能损耗。
评论区