Apache ShenYu网关初体验

2022-11-18 16:42:23 浏览数 (1)

前言

Apache ShenYu(神禹)是采用Java WebFlux编写的响应式API网关,具有异步、高性能、跨语言的特点。

  • 支持HTTP、Dubbo、 Spring Cloud、 gRPC、 Motan、 Sofa、 Tars 等协议
  • 采用插件化设计思想,插件热插拔,易扩展
  • 灵活的流量筛选,能满足各种流量控制
  • 内置鉴权、限流、熔断、防火墙等插件
  • 流量配置动态化,性能极高
  • 支持集群部署,支持A/B测试、蓝绿发布

架构图

快速部署

Apache Shenyu 支持本地部署、单机快速部署、二进制包部署、Docker部署、K8s部署、集群部署等,为了能够快速体验,我们使用本地部署,同时也为了方便后期看源码。

环境准备

  • 本地正确安装JDK1.8
  • 本地正确安装Git
  • 本地正确安装Maven
  • 选择一款开发工具,比如IDEA

下载编译代码

  1. https://github.com/apache/shenyu.git下载最新仓库,下载完成后使用mvn clean install -Dmaven.javadoc.skip=true -B -Drat.skip=true -Djacoco.skip=true -DskipITs -DskipTests编译打包一下。
  2. 导入IDEA,切换分支到最小的release版本,我这目前为 2.5.0-release
  3. 使用开发工具启动 org.apache.shenyu.admin.ShenyuAdminBootstrap,访问 http://localhost:9095 , 默认用户名和密码分别为: admin123456(默认使用H2数据库),这是Shenyu运维管理后台。
  4. 使用开发工具启动 org.apache.shenyu.bootstrap.ShenyuBootstrapApplication,这就相当于微服务网关

如下是管理后台截图:

官网的git地址有误:https://github.com/apache/incubator-shenyu.git

微服务集成

前期准备:nacos服务,搭建步骤看nacos官网 版本关系:

代码语言:javascript复制
<shenyu.version>2.4.3</shenyu.version>
<boot.version>2.2.2.RELEASE</boot.version>
<cloud.version>Hoxton.SR8</cloud.version>
<nacos.version>2.2.6.RELEASE</nacos.version>

版本管理(统一加到父级pom中):

代码语言:javascript复制
<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

创建网关

  1. 创建网关服务shenyu-gateway,依赖的pom.xml如下
代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!--shenyu-->
<!--shenyu gateway start-->
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-gateway</artifactId>
    <version>${shenyu.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
    <version>${shenyu.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-commons</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
    <version>${shenyu.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-instance</artifactId>
    <version>${shenyu.version}</version>
</dependency>

<!--nacos-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${nacos.version}</version>
</dependency>

<!-- apache shenyu data sync start use nacos-->
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-sync-data-nacos</artifactId>
    <version>${shenyu.version}</version>
</dependency>
  1. application.yml配置如下:
代码语言:javascript复制
server:
  port: 7000

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
    discovery:
      enabled: true
  main:
    allow-bean-definition-overriding: true
    allow-circular-references: true
  codec:
      max-in-memory-size: 2MB
  application:
    name: shenyu-gateway

shenyu:
  sync:
    nacos:
      url: ${spring.cloud.nacos.server-addr}
      # url: 配置成你的 nacos地址,集群环境请使用(,)分隔。
      namespace: sync-data
  1. GatewayApplication代码
代码语言:javascript复制
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {

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

}

通常如上三步,已经集成了shenyu-gateway服务。 启动完成日志,可以清楚的看到Shenyu的Logo:

代码语言:javascript复制
2022-08-26 00:42:11.706  INFO 2300 --- [           main] org.apache.shenyu.web.logo.ShenyuLogo    : 


   _____ _                            
  / ____| |                           
 | (___ | |__   ___ _ __  _   _ _   _ 
  ___ | '_  / _  '_ | | | | | | |
  ____) | | | |  __/ | | | |_| | |_| |
 |_____/|_| |_|___|_| |_|__, |__,_|
                           __/ |      
                          |___/       
 :: Shenyu :: (v2.4.3)


  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _    
( ( )___ | '_ | '_| | '_ / _` |    
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |___, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)

2022-08-26 00:42:13.111  INFO 2300 --- [           main] c.s.demo.gateway.GatewayApplication      : No active profile set, falling back to default profiles: default
...省略
2022-08-26 00:42:21.644  INFO 2300 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 7000
2022-08-26 00:42:22.363  INFO 2300 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP shenyu-gateway 192.168.0.115:7000 register finished
2022-08-26 00:42:23.104  INFO 2300 --- [           main] c.s.demo.gateway.GatewayApplication      : Started GatewayApplication in 12.584 seconds (JVM running for 13.613)

0 人点赞