网关能干什么?
- 反向代理
- 鉴权
- 流量控制
- 日志监控等
微服务架构中网关处于那个位置?
The first one
- 建立一个Model
- 加入依赖
- 写入yml配置文件
- 主启动类编写
第一步:建立一个普通的Maven项目
第二步:加入基本的依赖包
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-geteway-getway9527</artifactId>
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</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>
</dependencies>
</project>
第三步:编写yml配置文件
server:
port: 9527 #指定固定的端口号
spring:
application:
name: cloud-geteway
cloud:
gateway:
routes: #设置多个路由
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址,也就是要路由的服务地址。
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/discovery/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true #false表示不向注册中心注册自己,true反之
fetch-registry: true #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务,true反之。
defaultZone: http://eureka7001.com:7001/eureka #单机就是指向自己
第四步:编写主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @descriptions:
* @author:
* @date: 2021/6/28 18:14
* @version: 1.0
*/
@SpringBootApplication
@EnableEurekaClient //开启eureka客户端
public class GateWayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GateWayMain9527.class,args);
}
}
测试:http://localhost:9527/payment/get/3
The second
- 项目与 The first one 第一种相同,在第一个项目的基础上编写一个config包,在包下编写配置路由网关。
使用java代码来指定路由规则:
package com.atguigu.springcloud.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @descriptions:
* @author:
* @date: 2021/6/29 11:21
* @version: 1.0
*/
@Configuration
public class GateWayConfig {
/*
* 配置了一个id为routes-name的路由规则
* 当访问地址http://localhost9527/guonei时会自动转发到地址:http://news.baidu.com/guonei
* */
@Bean
public RouteLocator customRouteLocater(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_atguigu",
r -> r.path("/guonei")
.uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
//http://news.baidu.com/guoji
@Bean
public RouteLocator customRouteLocater2(RouteLocatorBuilder routeLocatorBuilder){
//路由定位生成器
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_atguigu2",
r -> r.path("/guoji")
.uri("http://news.baidu.com/guoji")).build();
return routes.build();
}
}