简介

Ribbon是Spring Cloud中的负载均衡器,类似于我们常用的Nginx和F5。在分布式系统中,一个服务通常都会有多个实例,Ribbon的作用就是将请求分发到这些实例上。Ribbon默认的分发策略是轮询,每个实例轮着发请求,防止某个实例负载过重。同时Ribbon也可以按照响应时间加权,响应时间快的实例多分发一些请求,响应时间慢的实例,少分发一些请求,从而合理的运用各个实例的资源。Ribbon也可以随机分发请求到实例上,有多种分发策略,可根据项目中的实际情况来选择。

- 阅读剩余部分 -

简介

Feign是Spring Cloud中的一个声明式的Web服务客户端,其目的就是让Spring Cloud中多个服务之间相互调用更简单。我们平常调用别的服务,需要写一大堆代码,而使用Feign,只需要声明一个接口即可,不需要关心传参、发送请求、获取响应内容、关闭连接等细节,Feign全部帮我们做好了。

- 阅读剩余部分 -

简介

Config是Spring Cloud中的配置中心,为分布式系统中的微服务应用提供集中化的外部配置支持,配置中心将各个微服务的配置集中管理起来,使得配置文件与项目解耦,配置的维护成本更低,配置更灵活。配置中心分为服务端和客户端,服务端使用Git或SVN以及本地磁盘保存配置文件。

- 阅读剩余部分 -

简介

Eureka是Netflix公司开源的一款提供服务注册与发现的组件,Spring Cloud基于Netflix公司的Eureka做了封装,Eureka是Spring Cloud中最重要的组件。Eureka分为Eureka Client和Eureka Server。每个服务都是Eureka Client,Eureka Client向Eureka Server注册自己,并从Eureka Server中获取注册表。这样就使多个独立的服务关联到一起了,并且每个服务都可以水平扩展和收缩。

- 阅读剩余部分 -

Spring Cloud介绍

Spring Cloud是一个基于Spring Boot实现的微服务开发框架,为开发者提供了快速构建分布式系统的组件,其核心组件主要包括:Eureka、Config、Feign、Ribbon、Hystrix、Zuul。

为什么要用微服务

平常我们开发的系统,一般都是单体架构,一个系统一个war包,但是随着系统功能越来越多,架构越来越复杂,项目变得越来越臃肿,导致越来越难以维护和扩展,修改任意一个模块的代码,都需要将整个系统重新打包和部署。单体架构的系统,所有模块都是共享资源,资源没有隔离,如果某个模块占用资源太多,会导致其他模块也不能正常访问。

- 阅读剩余部分 -

当@SpringBootApplication的类的main函数执行SpringApplication.run()方法的时候,会执行2次run()方法(第1次是加载bootstrap.properties之后,第2次是加载application.properties之后),并且会执行2次run()方法中的如下代码:

ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);

同时以上代码会执行:

LoggingApplicationListener.onApplicationEnvironmentPreparedEvent();

- 阅读剩余部分 -

JDK自带的HttpURLConnection,默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接, 使用后的HttpURLConnection会放入缓存中供以后的同host:port的请求重用,底层的socket在keepAlive超时之前不会关闭。

HttpURLConnection受以下system properties控制:
http.keepAlive=<boolean>(默认值:true),是否启用keepAlive,如果设置为false,则HttpURLConnection不会缓存,使用完后会关闭socket连接。
http.maxConnections=<int>(默认值:5),每个目标host缓存socket连接的最大数。

- 阅读剩余部分 -

servlet、filter、listener分别定义2个,代码如下:

public class GlobalServlet extends HttpServlet {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        logger.info("init");
    }
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        logger.info("service");
        PrintWriter pw = resp.getWriter();
        pw.write("This is "+this.getClass().getSimpleName());
        pw.close();
    }
    
    @Override
    public void destroy() {
        logger.info("destroy");
    }
}

public class LoginServlet extends HttpServlet {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        logger.info("init");
    }
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        logger.info("service");
        PrintWriter pw = resp.getWriter();
        pw.write("This is "+this.getClass().getSimpleName());
        pw.close();
    }
    
    @Override
    public void destroy() {
        logger.info("destroy");
    }
}

public class GlobalFilter implements Filter {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        logger.info("start doFilter");
        chain.doFilter(request, response);
        logger.info("end doFilter");
    }

    @Override
    public void destroy() {
        logger.info("destroy");
    }
}

public class LoginFilter implements Filter {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        logger.info("start doFilter");
        chain.doFilter(request, response);
        logger.info("end doFilter");
    }

    @Override
    public void destroy() {
        logger.info("destroy");
    }
}

public class ContextListener1 implements ServletContextListener {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("contextDestroyed");
    }
}

public class ContextListener2 implements ServletContextListener {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("contextDestroyed");
    }
}

- 阅读剩余部分 -