### 使用网关，为同一套接口提供不同的输出（Solon 自带）

网关的技术本质，是一个定制了的 Solon Handler。如此理解，新切感会好些：）

```java
//网关1
@Mapping("/api/rest/**")
@Component
public class Gateway1 extends Gateway {
    @Override
    protected void register() {
        //设定默认render
        before(c -> c.attrSet("@render", "@json"));

        //添加服务
        add("user", UserServiceImpl.class, true);

    }
}

//网关2
@Mapping("/api/rpc/**")
@Component
public class Gateway2 extends Gateway {
    @Override
    protected void register() {
        //设定默认render
        before(c -> c.attrSet("@render", "@type_json"));

        //添加服务（不带mapping的函数；需要 remoting = true，才会加载出来）
        add("user", UserServiceImpl.class, true);
    }
}

//网关3（这个比较复杂，和实战性）
@Mapping("/api/v2/app/**")
@Component
public class Gateway3 extends UapiGateway {
    @Override
    protected void register() {
    
        filter(new BreakerFilter()); //融断过滤器

        before(new StartHandler()); //开始计时
        before(new ParamsParseHandler()); //参数解析
        before(new ParamsSignCheckHandler(new Md5Encoder())); //参数签名较验
        before(new ParamsRebuildHandler(new AesDecoder())); //参数重构

        after(new OutputBuildHandler(new AesEncoder())); //输出构建
        after(new OutputSignHandler(new Md5Encoder())); //输出签名
        after(new OutputHandler()); //输出
        after(new EndBeforeLogHandler()); //日志
        after(new EndHandler("v2.api.app")); //结束计时

        addBeans(bw -> "api".equals(bw.tag()));
    }
}
```