分类 SpringCloud源码 中的文章

SpringCloud源码| eureka源码

eureka server启动流程 EurekaBootStrap#contextInitialized(ServletContextEvent) 方法进行初始化 @Override public void contextInitialized(ServletContextEvent event) { try { //1、初始化eureka相关环境 initEurekaEnvironment(); //2、初始化eureka的serverContext initEurekaServerContext(); ServletContext sc = event.getServletContext(); sc.setAttribute(EurekaServerContext.class.getName(), serverContext); } catch (Throwable e) { logger.error("Cannot bootstrap eureka server :", e); throw new RuntimeException("Cannot bootstrap eureka server :", e); } } /** * Users can override to initialize the environment themselves. */ protected void initEurekaEnvironment() throws Exception { logger.info("Setting the eureka configuration.."); AbstractConfiguration configInstance = ConfigurationManager.getConfigInstance(); String dataCenter = configInstance.……

阅读全文

SpringCloud源码| feign源码

feign核心组件 Encoder和Decoder:编解码组件。SpringEncoder和ResponseEntityDecoder Contract:解析spring mvc相关组件。SpringMvcContract Feign.Builder:FeignClient的一个实例构造器,builder模式 FeignClient:LoadBalancerFeignClient ,底层整合ribbon feign的使用和自定义配置 @FeignClient(name = “ServiceA”, configuration = MyConfiguration.class) public interface ServiceAClient { } public class MyConfiguration { @Bean public RequestInterceptor requestInterceptor() { return new MyRequestInterceptor(); } } feign的入口 @EnableFeignClients,使用FeignClientsRegistrar扫描包下面的所有FeignClient。 使用SpringMvcContract解析相关spring mvc注解,生成LoadBalancerFeignClient动态代理 FeignClient底层使用ribbon进行负载均衡,调用对应的远程服务 @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { //省略 } //FeignClientsRegistrar类的重要方法 @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { //注册bean registerDefaultConfiguration(metadata, registry); //扫描所有@FeignClient,解析注解中的所有属性。注册对应的FeignClient registerFeignClients(metadata, registry); } private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { Map<String, Object> defaultAttrs = metadata .……

阅读全文

SpringCloud源码| hystrix源码

hystrix在微服务中扮演重要作用,其实现了隔离、熔断、降级等重要组件 但在spring cloud中,常与feign搭配起来使用。故本文仅包含其余feign整合后的相关源码。 hystrix资源隔离 共有两种:线程池的资源隔离,信号量的资源隔离 线程池:适合绝大多数的场景,99%的,线程池,对依赖服务的网络请求的调用和访问,timeout这种问题 信号量:适合对内部的一些比较复杂的业务逻辑的访问,但是像这种访问,系统内部的代码,其实不涉及任何的网络请求,那么只要做信号量的普通限流就可以了,因为不需要去捕获timeout类似的问题。但算法+数据结构的效率不是太高,并发量突然太高,因为这里稍微耗时一些,导致很多线程卡在这里的话,不太好,所以进行一个基本的资源隔离和访问,避免内部复杂的低效率的代码,导致大量的线程被hang住 feign集成hystrix以后,HystrixFeign.Builder则被替换为HystrixFeign.Builder。以支持hystrix相关组件 //ReflectiveFeign 类中 public <T> T newInstance(Target<T> target) { Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target); //对应FeignClient中的方法,及代理类 Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>(); List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>(); for (Method method : target.type().getMethods()) { if (method.getDeclaringClass() == Object.class) { continue; } else if (Util.isDefault(method)) { DefaultMethodHandler handler = new DefaultMethodHandler(method); defaultMethodHandlers.add(handler); methodToHandler.put(method, handler); } else { methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method))); } } //调用HystrixFeign.……

阅读全文

SpringCloud源码| ribbon源码

ribbon的作用:一个服务部署多个实例时,负责负载均衡请求的组件 ribbon重要组件 ILoadBalancer:负载均衡器,其中包含了IRule和IPing IRule:负责负载均衡选择服务的规则 IPing:定时ping服务器,判断其是否存活 public class MyConfiguration { @Bean public IRule getRule() { return new MyRule(); } @Bean public IPing getPing() { return new MyPing(); } } @RibbonClient(name = "ServiceB", configuration = MyConfiguration.class) public class ServiceBConfiguration { } ribbon的入口 @LoadBalanced将将一个RestTemplate标志为底层采用LoadBalancerClient来执行实际的http请求,支持负载均衡。 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration中有相关的bean注册。LoadBalancerRequestFactory、LoadBalancerInterceptor、RestTemplateCustomizer等等 使用RestTemplateCustomizer对每个restTemplate,使用LoadBalancerInterceptor进行定制。 @Bean @ConditionalOnMissingBean public LoadBalancerRequestFactory loadBalancerRequestFactory( LoadBalancerClient loadBalancerClient) { return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers); } @Configuration(proxyBeanMethods = false) @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate") static class LoadBalancerInterceptorConfig { //配置拦截器 @Bean public LoadBalancerInterceptor loadBalancerInterceptor( LoadBalancerClient loadBalancerClient, LoadBalancerRequestFactory requestFactory) { return new LoadBalancerInterceptor(loadBalancerClient, requestFactory); } //RestTemplate定制化,使用LoadBalancerInterceptor @Bean @ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer( final LoadBalancerInterceptor loadBalancerInterceptor) { return restTemplate -> { List<ClientHttpRequestInterceptor> list = new ArrayList<>( restTemplate.……

阅读全文

SpringCloud源码| zuul源码

zuul主要使用责任链设计模式 其中有如下过滤器 pre过滤器 -3:ServletDetectionFilter -2:Servlet30WrapperFilter -1:FromBodyWrapperFilter 1:DebugFilter 5:PreDecorationFilter routing过滤器 10:RibbonRoutingFilter 100:SimpleHostRoutingFilter 500:SendForwardFilter post过滤器 0:SendErrorFilter 900:LocationRewriteFilter 1000:SendResponseFilter @EnableZuulProxy为spring cloud中zuul的入口 @EnableCircuitBreaker @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(ZuulProxyMarkerConfiguration.class) public @interface EnableZuulProxy { } 然后在ZuulProxyAutoConfiguration进行相关类的注册 经过断点调试,核心逻辑为此方法ZuulServlet#service @Override public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException { try { init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); // Marks this request as having passed through the "Zuul engine", as opposed to servlets // explicitly bound in web.……

阅读全文

SpringCloud源码| 从单体到微服务

1、代码重复问题 拆分成多个服务,通过网络请求不同的服务。代码不再耦合重复 2、多人协作效率问题 各种专注于自己的小范围即可,代码不会与其他服务冲突。测试上线不依赖其他服务 3、扩容问题 之前其他服务(cpu/内存/网络/io)问题会导致服务宕机,现在各自独立部署,独立扩容。节省资源 4、可用性问题 依赖的其他服务宕机,是他自己的事。做好熔断降级就好了。……

阅读全文