2 微服务实战系列

来源:互联网 发布:淘宝开代购店 编辑:程序博客网 时间:2024/05/17 23:21

**服务网关解决问题:
1 内外网隔离,统一对外访问,统一权限控制,资源授权访问
2 自动路由,用户访问路由规则分发到响应服务**

1 pom配置

 <!-- spring boot的parent 配置文件,有大部分spring boot需要用的Jar包 -->    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.6.RELEASE</version>    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <java.version>1.7</java.version>    </properties>    <profiles>        <profile>            <id>www</id>            <activation>                <activeByDefault>true</activeByDefault>            </activation>            <properties>                <!-- 系统参数 -->                <server.mode>false</server.mode>                <error.subject>gateway-www</error.subject>                <!-- 服务注册 -->                <url.defaultZone>http://register.totodi.com/eureka/</url.defaultZone>            </properties>        </profile>    </profiles>    <dependencies>        <!-- eureka-server -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <!-- 网关 -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-zuul</artifactId>        </dependency>        <!-- spring boot-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>            <exclusions><!-- 去掉默认配置 -->                  <exclusion>                      <groupId>org.springframework.boot</groupId>                      <artifactId>spring-boot-starter-logging</artifactId>                  </exclusion>              </exclusions>          </dependency>        <!-- 引入log4j2依赖 -->          <dependency>             <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-log4j2</artifactId>          </dependency>        <!-- 邮件发送 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-mail</artifactId>        </dependency>        <!-- 模板引擎 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-freemarker</artifactId>        </dependency>        <!-- fastjson依赖 -->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.31</version>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Dalston.SR2</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement>    <!-- spring boot的maven打包插件 -->    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <executable>true</executable>                </configuration>            </plugin>            <plugin>                   <artifactId>maven-resources-plugin</artifactId>                   <configuration>                       <encoding>utf-8</encoding>                       <useDefaultDelimiters>true</useDefaultDelimiters>                   </configuration>               </plugin>        </plugins>        <resources>            <resource>                <directory>src/main/resources</directory>                <filtering>true</filtering>            </resource>        </resources>        <finalName>gateway</finalName><!-- 包名 -->    </build>

2 程序设置

  • 2.1 入口程序
@Autowired DiscoveryClient discoveryClient;    @Bean    public AccessFilter accessFilter() {        return new AccessFilter();    }    @Bean    public ErrorFilter errorFilter() {        return new ErrorFilter();    }    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {        builder.sources(this.getClass());        return super.configure(builder);    }    @Bean     public MultipartConfigElement multipartConfigElement() {         MultipartConfigFactory factory = new MultipartConfigFactory();        // 设置文件大小限制 ,超了,页面会抛出异常信息,这时候就需要进行异常信息的处理了;        factory.setMaxFileSize("500MB"); //KB,MB        // 设置总上传数据总大小        factory.setMaxRequestSize("500MB");         return factory.createMultipartConfig();     }    public static void main(String[] args) {        SpringApplication.run(ApiGatewayApplication.class, args);    }    @RequestMapping("/info")    public String info() {        List<String> services = discoveryClient.getServices();        Map<String, Object> re = Maps.newHashMap();        for(String temp : services){            re.put(temp, discoveryClient.getInstances(temp));        }        return JSON.toJSONString(services);    }
  • 2.2 filter注入
private static final Logger LOGGER = LoggerFactory.getLogger(AccessFilter.class);    @Override    public Object run() {        RequestContext ctx = RequestContext.getCurrentContext();        HttpServletRequest request = ctx.getRequest();        LOGGER.info(String.format("send %s request to %s", request.getMethod(), request.getRequestURL().toString()));        LOGGER.info("isDispatcherServletRequest:{}", RequestUtils.isDispatcherServletRequest());        LOGGER.info("isZuulServletRequest:{}", RequestUtils.isZuulServletRequest());        // 判断是否OPTIONS请求        if(request.getMethod().equals("OPTIONS")){            return null;        }// 参数必传        if (StringUtils.isEmpty(mac) || StringUtils.isEmpty(os) || StringUtils.isEmpty(version) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(sign)) {            LOGGER.warn("access token is empty!");            String body = JSON.toJSONString(Message.failure(ApiCodeEnum.NOT_AUTHORIZED));            ctx.setSendZuulResponse(false);            ctx.setResponseBody(body);            ctx.setResponseStatusCode(401);            return null;        }        // 签名算法        String signStr = EncryptUtils.encodemd5(timestamp.trim()).substring(11, 17);        if (!signStr.equalsIgnoreCase(sign.trim())) {            LOGGER.warn("access token wrong!");            String body = JSON.toJSONString(Message.failure(ApiCodeEnum.NOT_AUTHORIZED));            ctx.setSendZuulResponse(false);            ctx.setResponseBody(body);            ctx.setResponseStatusCode(401);          return null;        }        LOGGER.info("access token ok");        return null;    }    @Override    public boolean shouldFilter() {        return true;    }    @Override    public int filterOrder() {        return 0;    }    @Override    public String filterType() {        return "pre";    }

3 应用配置

server.port=8002spring.application.name=gateway#\u6ce8\u518c\u670d\u52a1\u5668\u7684\u5730\u5740\uff1a\u670d\u52a1\u63d0\u4f9b\u8005\u548c\u670d\u52a1\u6d88\u8d39\u8005\u90fd\u8981\u4f9d\u8d56\u8fd9\u4e2a\u5730\u5740eureka.client.serviceUrl.defaultZone=http://register.shulai8.com/eureka/#spring cloud eureka IP\u6ce8\u518c\u800c\u4e0d\u662f hostName\u6ce8\u518c\u3002Spring\u5c31\u4f1a\u81ea\u52a8\u4e3a\u6211\u4eec\u83b7\u53d6\u7b2c\u4e00\u4e2a\u975e\u56de\u73afIP\u5730\u5740eureka.instance.prefer-ip-address=true#\u90ae\u4ef6\u914d\u7f6espring.mail.host=smtp.exmail.qq.comspring.mail.username=tech@shulaibao.comspring.mail.password=iiu7mBC6ddj0Yiiispring.mail.default-encoding=UTF-8# \u9879\u76eecontextPathserver.context-path=/spring.resources.chain.strategy.content.enabled=truespring.resources.chain.strategy.content.paths=/**# URI\u7f16\u7801server.tomcat.uri-encoding=UTF-8server.tomcat.access-log-enabled=truelogging.config=classpath:log4j2.xml
原创粉丝点击