spring authorization server 1.0.1与阿里nacos2.2.2微服务学习笔记(七)

创建一个简单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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>gateway</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2022.0.2</spring-cloud.version>
        <alibaba.version>2022.0.0.0-RC1</alibaba.version>
    </properties>
    <dependencies>
        <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>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </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>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <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>${alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.配置文件:application.yml

server:
  port: 9001
spring:
  application:
    name: gateway
  cloud:
    gateway:
      httpserver:
        wiretap: true
org:
  springframework:
    cloud:
      gateway: true

---
spring:
  config:
    activate:
      on-profile: dev
    import: optional:nacos:测试环境nacos服务里的配置文件名.yml
  cloud:
    nacos:
      discovery:
        server-addr: 测试nacos服务器:8848
        namespace: development
      username: 测试nacos服务器账号
      password: 测试nacos服务器密码
      config:
        group: DEFAULT_GROUP
        server-addr: 测试nacos服务器ip:8848
        namespace: 测试nacos服务命名空间
#logging:
  level:
    reactor:
      netty: TRACE
    org:
      springframework:
        cloud:
          gateway: TRACE


---
spring:
  config:
    activate:
      on-profile: prod
    import: optional:nacos:生产nacos服务里配置的文件名.yml
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 生产环境命名空间
      username: 生产环境nacos账号
      password: 生产环境nacos密码
      config:
        group: DEFAULT_GROUP
        server-addr: 127.0.0.1:8848
        namespace: 生产环境命名空间
server:
  ssl:
    key-store: classpath:keystore.pfx
    key-store-type: PKCS12
    key-store-password: ssl证书密码
    key-alias: alias

3.启动类

package cn.anfengnet.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args); 

    }

}

4.打印转发日志

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.Collections;
import java.util.Set;

import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.*;

@Service
public class LogFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        Set<URI> uris = exchange.getAttributeOrDefault(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, Collections.emptySet());
        String originalUrl = (uris.isEmpty()) ? "Unknown" : uris.iterator().next().toString();
        Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
        URI routeUri = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
        System.out.println("访问地址:" + originalUrl + " 转发地址:" + route.getId() + " , uri:"+ routeUri);
        return chain.filter(exchange);
    }
}

5.nacos里面的配置文件

Data ID: routes.yml
Group: DEFAULT_GROUP
Format: YAML
内容:id为log的这节可以不要,这里假设新增了一个名字叫log的微服务

spring:
  cloud:
    gateway:
      routes:
      - id: oauth2
        uri: lb://oauth2
        predicates:
          - Path=/oauth2/**
      - id: log
        uri: lb://log
        predicates:
          - Path=/api/log/**

猜你喜欢

转载自blog.csdn.net/miaowansheng/article/details/130426403