本文来自网易云社区,转载务必请注明出处。

Spring Cloud 是spring团队推出的基于SpringBoot的分布式微服务框架,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。

随着部门内的产品,包括对外提供的一些服务越来越多,另外有一些基础的功能需要抽象出来,团队内部就开始对一些接口和业务进行服务化的改造,经过一些对比,初步采用的方案就是spring cloud。现对spring cloud的使用做一些简单的总结。

基本配置

maven配置

项目本身都是基于maven的,首先可以利用maven的parent project的特性来管理spring cloud依赖的版本,spring cloud本身也提供了几个starter project的maven依赖管理的基础jar包。大致的配置如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.1.RELEASE</version>
    </parent>     <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        ...    </dependencies>

服务注册中心

dubbo的服务的注册和发现可以依赖于zk或者redis来实现,spring cloud官方提供了自己的解决方案,使用eureka来做的,所以我们需要一个eureka server,实现起来很简单,按照示例来即可:

  1. pom中添加

         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-eureka-server</artifactId>
         </dependency>
  2. 主程序如下

    @SpringBootApplication@EnableEurekaClientpublic class EurekaServer { public static void main(String[] args) {
         SpringApplication.run(EurekaServer.class, args);
     }
    }
  3. 在application.properties中添加监听的端口号,如server.port=8761,然后启动程序即可

注册一个服务

  1. 在main函数所在程序中添加 @SpringBootApplication注解

  2. 在application.properties中添加上面注册中心的地址,比如说, eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/ 注意,生产环境这个注册中心是需要多节点的

  3. 设置服务注册的名称,以及监听的端口,也是在application.properties中的,如:

spring.application.name=spam-detect-service
server.port=8082
  1. 在controller上添加 @RestController及方法的@RequestMapping注解

启动main函数,我们的服务就启动并注册到eureka server上了

发现并调用服务

  1. 在主程序的入口添加注解

@SpringBootApplication@EnableEurekaClient
  1. 添加一个RestTemplate实例(在主程序中添加即可),声明为bean,方便别的服务进行autowired注入,用来进行HTTP调用

@LoadBalanced@BeanRestTemplate restTemplate() {    return new RestTemplate();
}
  1. 配置application.properties,主要是配置注册中心的地址 eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/

  2. 在程序的代码中使用restTemplate根据服务名称访问服务

@AutowiredRestTemplate restTemplate;static final String SERVICE_NAME = "spam-detect-service";public MMResult spamDetect(String type, String image) {    try {
        ....
        MMResult r = restTemplate.postForObject("http://" + SERVICE_NAME
                + "/xxxx", request, MMResult.class);        return r;
    } catch (Throwable t) {
        ....
    }
}

服务注册/发现

Spring Cloud的一个重要贡献者是Netflix,它提供了构建一个分布式rpc系统的关键的一些核心模块,在spring cloud 中,我们可以通过几个简单的注释,就能构造一个分布式系统。系统中提供的模式包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡等。

服务发现

Spring Cloud默认使用netflix贡献的eureka来作为服务注册和发现的。 服务发现默认采用EurekaClient,使用方式是:

@Autowiredprivate EurekaClient discoveryClient;

可能是觉得EurekaClient不太好用,spring同时提供了替代的方式,就是基于Feign和上面提到的RestTemplate,在实例上添加@RestTemplate注解即可。

服务注册

在应用程序的main函数上添加如下注解即可

@SpringBootApplication@EnableEurekaServer

Ribbon

Spring Cloud采用ribbon来实现负载均衡loadbalance,使用restTemplate的时候添加@LoadBalance注解即可。服务的失败重试retry、超时配置等,可以在application.properties中做一下配置即可

ribbon.ConnectTimeout=500ribbon.ReadTimeout=5000ribbon.MaxAutoRetries=1ribbon.MaxAutoRetriesNextServer=1ribbon.OkToRetryOnAllOperations=true

ribbon还可以不使用服务名称的方式进行调用,可以把服务配置为固定的物理地址列表进行访问,为服务名称

.ribbon.listOfServers= 127.0.0.1:1234,127.0.0.1:1235

断路器(Circuit Breaker)

当服务不可用的时候,或者需要进行并发访问控制的时候使用的,spring cloud采用Hystrix来实现,在业务方法上加上@HystrixCommand 注解

服务不可用事默认回复

配置@HystrixCommand的fallback属性,如@HystrixCommand(fallbackMethod = "systemError"),注意systemError方法需要与业务方法的参数是一致的

并发访问控制

配置@HystrixCommand的properties属性

commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") }, threadPoolProperties = {
            @HystrixProperty(name = "coreSize", value = "5"),
            @HystrixProperty(name = "maxQueueSize", value = "10") }

服务路由zuul

zuul是基于jvm的路由转发和负载均衡,有点类似于nginx,但是是基于jvm的,我们java程序员可以很方便的在上面做一些事情,它通常是放在入口,可以做一些转发、安全校验等统一的事情。它既可以转发到本地的服务,也可以转发到互联网上其它url(使用ribbon的固定物理地址方式)。

配置转发

在application.properties中配置

zuul.routes.<users>.path = /myusers/**
zuul.routes.<users>.serviceId = users

在代码中定义转发

@Beanpublic PatternServiceRouteMapper serviceRouteMapper() {    return new PatternServiceRouteMapper(        "(?<name>^.+)-(?<version>v.+$)",        "${version}/${name}");
}

其它

可以配置zuul.host.maxTotalConnections 和 zuul.host.maxPerRouteConnections 可以控制路由的并发量

其它常用配置项

ip prefer and ignore

SpringCloud注册服务的时候使用的是InetUtils的findFirstNonLoopbackAddress()方法,有时候我们的服务器被发现的地址,偏偏不是机房内的互通ip,导致服务注册上了,调用的时候访问不通,这时候我们就需要设置忽略这个ip了,在配置文件中 spring.cloud.inetutils.ignoredInterfaces=eth0

跨域

不讨论跨域的必要性,如果需要用到跨域请求,需要做以下配置

  1. 在代码中设置 response.addHeader("Access-Control-Allow-Origin", "*");

  2. 添加option处理类

    @RestControllerpublic class OptionBean { @RequestMapping(method = RequestMethod.OPTIONS, value = "/**") public ResponseEntity manageOptions(HttpServletResponse response) {
         response.addHeader("Access-Control-Allow-Origin", "*");
         response.setHeader("Allow", "HEAD,GET,PUT,OPTIONS");     return new ResponseEntity(HttpStatus.OK);
     }
    }

    3.设置 spring.mvc.dispatch-options-request=true

tomcat的一些配置

如需要设置post size,upload file dize 等

@Bean  
    public MultipartConfigElement multipartConfigElement() {  
        MultipartConfigFactory factory = new MultipartConfigFactory();  
        factory.setMaxFileSize("20MB");  
        factory.setMaxRequestSize("20MB");  
        return factory.createMultipartConfig();  
    }    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();         tomcatFactory.addConnectorCustomizers(new TomcatConnectorCustomizer() {            @Override
            public void customize(Connector connector) {                // tomcat default nio connector
                Http11NioProtocol handler = (Http11NioProtocol) connector
                        .getProtocolHandler();                // acceptCount is backlog, default value is 100, you can change
                // which you want value in here
                handler.setBacklog(100);
                handler.setMaxThreads(1000);
                connector.setMaxPostSize(-1);
            }
        });        return tomcatFactory;
    }

服务存活检查

eureka.client.healthcheck.enabled=true

Spring Cloud其它功能及后续关注

  • 配置中心,原生时基于git,感觉不太好用,所以暂时没有更多关注

  • 与zookeeper、netty等的交互。目前主要是基于http的,对于实时性要求比较高的场合,可以研究一下

本文来自网易云社区 ,经作者王洪伟授权发布。

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 NOS直传加速服务

Spring Cloud使用总结的更多相关文章

  1. spring/spring boot/spring cloud开发总结

    背景        针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...

  2. 转 Netflix OSS、Spring Cloud还是Kubernetes? 都要吧!

    Netflix OSS.Spring Cloud还是Kubernetes? 都要吧! http://www.infoq.com/cn/articles/netflix-oss-spring-cloud ...

  3. spring cloud 学习研究- spring-cloud-microservice-example

    spring cloud + docker 微服务架构 http://www.open-open.com/lib/view/open1437363835818.html 实例项目 https://gi ...

  4. Spring Cloud集成相关优质项目推荐

    Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. Spring Cloud Bus 事件.消 ...

  5. spring boot分布式技术,spring cloud,负载均衡,配置管理器

    spring boot分布式的实现,使用spring cloud技术. 下边是我理解的spring cloud的核心技术: 1.配置服务器 2.注册发现服务器eureka(spring boot默认使 ...

  6. Spring Cloud 配置服务

    Spring Cloud 配置服务 1. 配置服务简介 产生背景: 传统开发中,我们通常是将系统的业务无关配置(数据库,缓存服务器)在properties中配置,在这个文件中不会经常改变,但随着系统规 ...

  7. Microservices Reference Architecture - with Spring Boot, Spring Cloud and Netflix OSS--转

    原文地址:https://www.linkedin.com/pulse/microservices-reference-architecture-spring-boot-cloud-anil-alle ...

  8. 综合使用spring cloud技术实现微服务应用

    在之前的章节,我们已经实现了配置服务器.注册服务器.微服务服务端,实现了服务注册与发现.这一章将实现微服务的客户端,以及联调.实现整个spring cloud框架核心应用. 本文属于<7天学会s ...

  9. Spring cloud实现服务注册及发现

    服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. 本文属于<7天学会spring cloud系列& ...

  10. 使用spring cloud实现分布式配置管理

    <7天学会spring cloud系列>之创建配置管理服务器及实现分布式配置管理应用. 本文涉及到的项目: 开源项目:http://git.oschina.net/zhou666/spri ...

随机推荐

  1. Spring Session 学习记录1

    先写些废话 新公司项目是有用到redis,之前老公司使用的缓存框架是ehcache.我redis并不熟悉.看过介绍以后知道是个nosql..既然是个数据库,那我想操作方法和jdbc操作关系数据库应该差 ...

  2. LeetCode之数组处理题java

    342. Power of Four Total Accepted: 7302 Total Submissions: 21876 Difficulty: Easy Given an integer ( ...

  3. linux安装mysql服务分两种安装方法:

    linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...

  4. 结对作业——四则运算 Part2. 封装与对接相关问题

    结对作业——四则运算 Part2. 封装与对接相关问题 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分Part 2. ...

  5. Using Mono DLLs in a Unity Project

    [Using Mono DLLs in a Unity Project] The path to the Unity DLLs will typically be: 一个生成dll的例子如下: mcs ...

  6. 147. Insertion Sort List (List)

    Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...

  7. fidder 自动保存请求内容

    背景: 因为公司有有app和sdk,这些项目没有对应的接口统计.重构的时候很容易忽略掉.所以对fiddler写了一点代码,能将请求的数据写入到文件或者数据库中.方便统计接口,下次重构的时候,方便统计影 ...

  8. Linux route

    一.简介 Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的 ...

  9. 清北学堂 day6 兔子

    ---恢复内容开始--- [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与 ...

  10. Linux系统巡检常用命令-乾颐堂

    Linux系统需要定期巡检,以检查服务器软硬件使用情况,相当于对人的体检,确保可以及时发现问题.解决问题,降低损失,常用的巡检命令如下: # uname -a # 查看内核/操作系统/CPU信息 # ...