springcloud+zuul+swagger2之微服务通过网关进行分发

因公司技术架构需要,我从zk+dubbo+springboot开始接触springcloud一系列架构。首先接触到新东西,我内心是希望得到学习的,毕竟技多不压身,更何况用springcloud也不是新技术了[苦瓜脸]。此文章主要讲述整个配置关键点,其他细节请找我家彦宏。

进入正题:用zuul网关的目的,就我目前来看是为了让几个服务对外保证一个域名请求,得到请求后网关进行转发到各个服务上。第一步准备两个及以上的微服务,这些都是注册到eureka上的服务名称

1.user-serive

user-service服务里的controller1: api/v1/user/userAddress

controller2:api/v1/user/userCompany

2.order-service:如上

3.zuul-service(网关服务)

第二步,在zuul服务里配置转发策略:

创建zuul模块的功能,就忽略不讲了,都可以在网上搜到。主要是一些配置application.yml的地方,我粘贴出来:

zuul:
  routes:
    order-service:
      path: /**/order/** 此处一定要这样写,不要写成/order/**;否则在进行转发的时候,请求不通;会在转发的时候,前面需要手动加上order,再连接api/v1才能请求;
    user-service:
      path: /**/user/**

在请求转发的过程中,第一次请求的时候,zuul会超时,原因如下:(如果大家想仔细了解,可去深究zuul机制)

这是因为zuul采用了懒加载机制,第一次访问的时候才会加载某些类,而不是启动时就加载了,由于默认的时间原本就比较短,加载这些类又需要一些时间,这就造成超时了。

解决方式是在application.yml中配置:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
             timeoutInMilliseconds: 5000

此时,如果有请求地址中有order的,就会转发到order-service去请求;如果地址中有user的,则会转发到user-service请求,成功转发。

————————————————————————————————————————————————————————

接下来贴一下swagger关联代码

添加swagger的方式:

1.在zuul服务中pom.xml加入:

<!-- swagger2 依赖 -->
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.6.0</version>
</dependency>
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.6.0</version>
</dependency>
<dependency>
   <groupId>com.github.xiaoymin</groupId>
   <artifactId>swagger-bootstrap-ui</artifactId>
   <version>1.8.1</version>
</dependency>

2.新建swagger配置类:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private DiscoveryClientRouteLocator discoveryClientRouteLocator;
    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo()) // .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInfo() {
        return new ApiInfoBuilder()
                .title("对接接口文档")
                .description("相关后台接口")
                .contact("程序猿")
                .version("1.0")
                .build();
    }

3.新建文档配置类

@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider{

    private final RouteLocator routeLocator;

    @Autowired
    private DiscoveryClient discoveryClient;

    @Value("${spring.application.name}")
    private String applicationName;

    public DocumentationConfig(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }
   // 自动获取系统配置的路由资源集合
   @Override
   public List<SwaggerResource> get() {
       List<SwaggerResource> resources = new ArrayList<>();
       // 排除自身,将其他的服务添加进去
       discoveryClient.getServices().stream().filter(s -> !s.equals(applicationName)).forEach(name -> {
           Optional<ServiceInstance> instanceOptional = discoveryClient.getInstances(name).stream().findFirst();
           if (instanceOptional.isPresent() && instanceOptional.get().getMetadata().containsKey("context-path")) {
               String contexPath = instanceOptional.get().getMetadata().get("context-path");
               resources.add(swaggerResource(name, "/" + name + contexPath + "/v2/api-docs", "2.0"));
           } else {
               resources.add(swaggerResource(name, "/" + name + "/v2/api-docs", "2.0"));
           }

       });
       return resources;
   }

    private SwaggerResource swaggerResource(String name, String location, String version) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion(version);
        return swaggerResource;
    }
}

————————————————————————————————————————————————————————

最后整体效果为:

?

注明:

此文章纯属个人分享,如有不对的地方请大家批评指正。

解决出来的部分内容也是我在网上搜罗汇集的,仅供参考

原文地址:https://www.cnblogs.com/sunnyguo/p/11826656.html

时间: 2024-11-05 19:04:52

springcloud+zuul+swagger2之微服务通过网关进行分发的相关文章

Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提供外部接口的微服务暴露给公网,那么意味着为了增强这个微服务的安全性,需要做很多额外的安全性措施,如报文数字签名.加密等:而大部分场景下,微服务本身又是提供给内部其他微服务调用的,即便所有的微服务都会不同程度地直接面向App客户端提供公网服务,那么为了这确保这些微服务的安全性,涉及的微服务也都需要实现

微服务Api网关框架课程

微服务Api网关框架课程网盘地址:https://pan.baidu.com/s/1drMBvzKulkQH1cD563lQTA 提取码:t7ho备用地址(腾讯微云):https://share.weiyun.com/5mrh1FH 密码:ub9u8v 课程就给大家介绍一下nignx + lua方式的网关框架,也是很多公司常用的网关框架 API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具有

springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离

1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2.多数据源:(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)支持N个数据源3.阿里数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发工具编辑器5.调用摄像头拍照 自定义裁剪编辑头像,头像图片色度调节6.we

企业分布式SpringCloud+SpringBoot+Mybatis+shiro+微服务 技术分享

介绍 Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热插拔的设计思想,使用成熟领先的无商业限制的主流开源技术构建.采用服务化的组件开发模式,可实现复杂的业务功能.提供驱动式开发模式,整合内置的代码生成器,将JavaEE开发效率提高5倍以上,减少50%的代码开发量,解决80%的重复工作,让开发者更关注业务逻辑.使用Maven进行项目的构建管理,采用Jenkins进行持续集成,主要定位于大型分布式企业系统或大型分

SpringCloud(8)微服务监控Spring Boot Admin

1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring Boot Admin UI部分使用AngularJs将数据展示在前端. 2.工程架构 Eureka Server:服务注册中心,端口为8761. Admin Server:用于对微服务系统进行统一的监控和管理. Admin Clinet:客户端集成Admin. 3.构建Admin Server 新建

微服务API网关

当你选择采用微服务构建自己的程序,则你需要考虑客户端怎样与后端服务交互.对于一个单体应用,仅有一个服务群提供服务(通过负载均衡器实现).在微服务架构里面,每一个服务都暴漏了一个服务器集群.本篇文章我们讨论它对于客户端通讯的影响和提出通过API网关的解决办法. 背景介绍 首先让我们想象一下一个购物的移动程序.它需要实现产品详情页展示,例如产品信息.库存信息.订单信息.购物车等.例如,下图显示了你将看到的产品信息: 尽管它仅仅是一个手机程序的详情页,它也显示了产品的一些信息.它不仅展示了一些产品的基

SpringCloud学习系列-Rest微服务构建-整体父工程Project

总体介绍 承接着我们的springmvc+mybatis+mysql初级高级课程,以Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务    Maven的分包分模块架构   一个Project带着多个Module子模块  MicroServiceCloud父工程(Project)下初次带着3个子模块(Module) microservicecloud-api 封装的整体Entity/接口/公共配置等 micr

SpringCloud(八)Consul的微服务注册

将微服务注册到Consul 1 入门案例 提供一个商品微服务 提供一个订单系统 将微服务注册到Consul 依赖 provider  <!--SpringCloud提供的对于Consul的服务发现-->         <dependency>             <groupId>org.springframework.cloud</groupId>             <artifactId>spring-cloud-starter-

微服务架构【SpringBoot+SpringCloud+VUE】一 || 微服务简介

目录 1.什么是微服务 2.Spring Cloud是什么 3.服务注册中心 4.学习交流QQ群[883210148] 1.什么是微服务 在开发项目之前,我们有必要了解一下,什么是微服务?简单来说:微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下,每个任务代表着一个小的业务能力. 2.Spring Cloud是什么 Spring Cloud是一个微服务框架的规