基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(十五)【权限架构消费者(完整实现)】

      在第十四章我们已经完成了通用业务类的编写,因此本章我们将讲解如何完整的实现我们的权限架构的消费者的实现,首先打开我们的rbac-consumer工程,接着打开我们的主入口文件RbacConsumerApplication.java加入@EnableDiscoveryClient和@EnableFeignClients注解如下所示:

package com.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class RbacConsumerApplication {

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

      接着在我们的resource底下创建application-prod-7100.properties配置文件,文件内容如下:

spring.application.name=rbac-consumer
server.port=7100

# 链路数据收集并发送地址
spring.zipkin.base-url=http://127.0.0.1:9100
# 当前应用收集信息百分比
spring.sleuth.sampler.percentage=0.1

# 实现日志的输出
logging.level.com.consumer.routeconsumer.service.RouteService = DEBUG

eureka.client.serviceUrl.defaultZone=http://fjhyll:[email protected]:2100/eureka/

# 开启GZIP的压缩功能以减少HTTP通信的消耗。
feign.compression.request.enabled=true;
feign.compression.response.enabled=true;
# 以下的请求的类型且请求数据的大小超过2048的将为会压缩传输。
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048

# 设置全局的超时时间
ribbon.ReadTimeout = 1000

# 该参数用来开启重试机制,它默认是关闭的。
spring.cloud.loadbalancer.retry.enabled=true
# 请求连接的超时时间。
RBAC-PRODUCE.ribbon.ConnectTimeout=250
# 请求处理的超时时间,该超时时间的影响层级大于全局的超时时间,设置了该时间那么,如果调用生产端的时候超过1秒那么就直接调用重试规则,因此若重试次数和切换次数都是为1那么,响应的时间不超过4秒
RBAC-PRODUCE.ribbon.ReadTimeout=1000
# 对所有操作请求都进行重试。
RBAC-PRODUCE.ribbon.OkToRetryOnAllOperations=true
# 以下重试实现响应EUREKA-PRODUCER的最大次数是 :(1 + MaxAutoRetries)* (1 + MaxAutoRetriesNextServer)
# 假设 MaxAutoRetries = 2 ,MaxAutoRetriesNextServer = 4 ,那么最大的重试次数为15次
# 切换实例的重试次数。
RBAC-PRODUCE.ribbon.MaxAutoRetriesNextServer=1
# 对当前实例的重试次数。
RBAC-PRODUCE.ribbon.MaxAutoRetries=1

feign.hystrix.enabled=true

# 这里需要注意一点, Ribbon的超时与Hystrix的超时是两个概念。 为了让上述的重试机制实现有效,我们需要让Hystrix的超时时间大于Ribbon的超时时间, 否则Hystrix命令超时后,该命令直接熔断, 重试机制就 没有任何意义了。
# Hystrix的全局的超时时间。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

       接着在com/consumer/sys/service目录底下创建一个DictService.java实现类内容如下:

package com.consumer.sys.service;

import com.base.entity.Dict;
import com.base.entity.QueryDict;
import com.consumer.common.base.service.GenericService;
import com.consumer.common.config.FullLogConfiguration;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.Map;

/**
 * Created by Administrator on 2018/1/30 0030.
 */
@FeignClient(value="RBAC-PRODUCE",configuration = FullLogConfiguration.class,path = "/dict")
public interface DictService extends GenericService<Dict,QueryDict> {

    /**
     * 功能描述:将字典数据初始化到前端js中
     * @return
     */
    @RequestMapping(value = "/loadDict",method = RequestMethod.POST)
    Map<String,Object> loadDict();



}

      最后在我们的com/produce/sys/controller底下创建我们的DictController.java实现类内容如下:

package com.consumer.sys.controller;

import com.base.entity.Dict;
import com.base.entity.QueryDict;
import com.consumer.common.base.controller.GenericController;
import com.consumer.common.base.service.GenericService;
import com.consumer.sys.service.DictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/*
* 类描述:
* @auther linzf
* @create 2018/1/30 0030 
*/
@RestController
@RequestMapping("/dict")
public class DictController  extends GenericController<Dict,QueryDict> {

    @Autowired
    private DictService dictService;

    @Override
    protected GenericService<Dict, QueryDict> getService() {
        return dictService;
    }

    /**
     * 功能描述:将字典数据初始化到前端js中
     * @return
     */
    @RequestMapping(value = "/loadDict",method = RequestMethod.POST)
    public Map<String,Object> loadDict(){
        return dictService.loadDict();
    }
}

      为了方便我们测试,我们需要给我们的权限架构消费者集成swagger2接口调测工具,因此在我们的config包底下新建一个swagger包同时创建我们的SwaggerConfig.java配置文件,配置内容如下:

package com.consumer.common.config.swagger;

import com.google.common.base.Predicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.BasicErrorController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


/*
* 类描述:集成swagger框架
* @auther linzf
* @create 2017/8/9 0009 
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private Environment env;


    @Bean
    public Docket createRestApi() {
        Predicate<RequestHandler> predicate = new Predicate<RequestHandler>() {
            @Override
            public boolean apply(RequestHandler input) {
                // 除非是在开发环境中否则不开启swagger2
                String active = env.getProperty("spring.profiles.active");
                if(!active.equalsIgnoreCase("prod-7100")){
                    return false;
                }
                Class<?> declaringClass = input.declaringClass();
                if (declaringClass == BasicErrorController.class)// 排除
                    return false;
                if(declaringClass.isAnnotationPresent(RestController.class)) // 被注解的类
                    return true;
                if(input.isAnnotatedWith(ResponseBody.class)) // 被注解的方法
                    return true;
                return false;
            }
        };
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .useDefaultResponseMessages(false)
                .select()
                .apis(predicate)
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("swagger2 接口测试专用页面!")//大标题
                .version("1.0")//版本
                .build();
    }

}

      到此我们完成了数据字典的配置工作,其他的用户管理、组织架构、角色管理和菜单管理也完全如上就不在此处累述了,大家直接看本章发布在GitHub上的源代码即可。

      接着我们启动我们的注册中心、链路中心、权限架构生产者、权限架构消费者,接着打开我们的eureka注册中心大家可以看到如下的页面则说明我们的所有中心已经全部正常启动成功了:


      接着直接访问我们的swagger工程地址:http://127.0.0.1:7100/swagger-ui.html#/,那么我们会看到如下的页面则表示我们的权限架构消费者已经集成成功了。


       到此为止的GitHub项目地址:https://github.com/185594-5-27/spring-cloud-rbac/tree/master-base-consumer-complete

上一篇文章地址:基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(十四)【权限架构消费者(通用类编写)】

下一篇文章地址:基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(十六)【路由网关】


QQ交流群:578746866


猜你喜欢

转载自blog.csdn.net/linzhefeng89/article/details/79353068