致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用

上两篇,我们使用了阿里巴巴的开源项目nacos,实现了基本的服务注册发现与配置中心,在服务注册后的消费服务中,我们使用了RestTemplate这个类去消费服务,我们在注入restTemplate这个Bean时,加上了@LoadBalance这个注解,实现负载均衡。当然还需要需要ribbon依赖

基本实现和测试

  • 添加依赖

 
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
            2.1.1.RELEASE
        
  •  注入Bean
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  • 配置文件
    将需要消费的服务(调用负载均衡)在配置中心配置的启动端口注释,不然无法模拟集群,注释后在对应应用程序中添加application-版本的配置文件,在里面分别添加server.port=对应的启动端口,利用idea在启动配置分别启动
    具体步骤:

    1.注释配置中心的配置

    致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用_第1张图片

    2.项目应用的配置

    致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用_第2张图片

    application-server1.properties
    server.port=8081

    application-server1.properties

    server.port=8082

    IDEA配置启动项(也可以从RUN ->EditConfiguration进入配置)
    致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用_第3张图片
    致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用_第4张图片
    配置好两个启动项,的结果如上图一

  • 启动测试查看
    这里为了方便查看负载均衡的效果,可以在要访问的方法中添加日志,打印当前配置中的端口号,或其余可区分的配置,我再次添加了一个过滤器(单纯查看无需这样,可以直接打印在方法中打印端口号),查看
     

    @WebFilter(urlPatterns = "/*", filterName = "originFilter")
    public class OriginFilter implements Filter {
        private static Logger logger = LoggerFactory.getLogger(OriginFilter.class);
    
        @Value("${server.port}")
        private String port;
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            logger.info("正在访问:third-server:" + port);
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            response.setHeader("Access-Control-Allow-Credentials","true"); //是否支持cookie跨域
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            logger.info("初始化:third-server:port = " + port);
        }
    
        @Override
        public void destroy() {
            logger.info("销毁:third-server:port = " + port);
        }
    }

    启动类加上@ServletComponentScan注解

    @SpringBootApplication
    @EnableDiscoveryClient
    @ServletComponentScan
    public class ThirdServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ThirdServerApplication.class, args);
        }
    }

    访问http://localhost:8888/master/file/hello 
    日志打印


    返回结果
    致力微服务 SpringCloud 插曲 篇三 模拟服务集群,测试负载均衡--一个应用多端口启用_第5张图片

  • 之后会详细追踪查看和解读RestTemplate负载均衡调用其他服务的源码

  • 之后尝试ribbon的自定义配置,因为负载均衡的规则目前都是默认的,我们没有做任何配置

你可能感兴趣的:(spring-cloud,ribbon,spring-cloud,SpringBoot)