支付宝RSA2支付&转帐接口集成续集|继续拿jblog当实验田练习支付宝RSA2集成 & 网银直连 直连网银 转账到银行卡下线了

续集开始

经过一阵折腾,一阵折腾,目前支付宝RSA2支付接口、查询支付结果接口、转帐接口、查询转账接口都调通了。

在线体验

支付

https://i.zuime.com/order/alipay

支付结果查询

https://i.zuime.com/order/alipay/pay/query?tradeNo=200001568282831558

转账

https://i.zuime.com/order/alipay/transfer

​转账结果查询

https://i.zuime.com/order/alipay/transfer/query?bizNo=T00011568284758838

支付单查询结果

{"alipay_trade_query_response":{"code":"10000","msg":"Success","buyer_logon_id":"z***","buyer_pay_amount":"0.00","buyer_user_id":"208","invoice_amount":"0.00","out_trade_no":"200001568282831558","point_amount":"0.00","receipt_amount":"0.00","send_pay_date":"2019-09-12 18:08:04","total_amount":"1.00","trade_no":"2019091222001404870598378129","trade_status":"TRADE_SUCCESS"},"alipay_cert_sn":"d129f75444e247d1fd7641eca25e8e8e","sign":"dksLpk0DN6FOMGpys2vsR6TfjFay3abv4aGh5lbikEuG7TBo2e2OSP4ilxjg9CR061wks7fLsQkriqomu0Yt36nq5HHex5BO+WInV4YiC+4HA1fxfNCIzXNFXGIIrNxO+H/AnpGbzU7uIjJfK3k56qKLnW9sWy0J83kdIUjohyrUkdIWqYFHiQrsb6P2akxV6743haC718QjzCuU6U7lpLRD9bncQ8OH7NXOSLUN396t8O7tBkLuIsHL6Q9TlbxW41sjzUpWUs2JBA3KPy32zxpsubl918HVM2s5eIdHkP6xYBUtSPU9ZMVl6tTbeya+n302tuVeW0c52Uf5lJYEOw=="}

转帐结果

{"alipay_fund_trans_order_query_response":{"code":"10000","msg":"Success","order_fee":"0.00","order_id":"20190912110070001506080013570558","out_biz_no":"T00011568280515442","pay_date":"2019-09-12 17:28:37","status":"SUCCESS"},"alipay_cert_sn":"d129f75444e247d1fd7641eca25e8e8e","sign":"JanJ5dR9SRIP/3MCFuqGc7iPCOs2DsaQQ6AI3fYPZDXHHpUVm865iEQAuPFavXIDB0huhWnz+sE38krPgD/srSJGOCxbEF0C7e0mTqNPDUSFGxaQ7nQX3t1iIorvKylNvqT7/+3A5qm837gtwKU98Z1Xzi7b6OsqAT+1UwEOdAs1QIysUK8kt515au9J/0pNC95ObkQEq4i+hCHzt+CFXFag7EThairmT4a9ZDegFpwBrFgHODYT6N3dqS9gE5hg9ULJh0tkAjKROQFsYiaBW+YIqzgAS/d+xjt37DLNwYhGMYxPYdlN/FwDg37Ao5wNkSqfYPJEamfbMK1VBDwVXA=="}

转帐查询结果

{"alipay_fund_trans_order_query_response":{"code":"10000","msg":"Success","order_fee":"0.00","order_id":"20190912110070001506080013570558","out_biz_no":"T00011568280515442","pay_date":"2019-09-12 17:28:37","status":"SUCCESS"},"alipay_cert_sn":"d129f75444e247d1fd7641eca25e8e8e","sign":"JanJ5dR9SRIP/3MCFuqGc7iPCOs2DsaQQ6AI3fYPZDXHHpUVm865iEQAuPFavXIDB0huhWnz+sE38krPgD/srSJGOCxbEF0C7e0mTqNPDUSFGxaQ7nQX3t1iIorvKylNvqT7/+3A5qm837gtwKU98Z1Xzi7b6OsqAT+1UwEOdAs1QIysUK8kt515au9J/0pNC95ObkQEq4i+hCHzt+CFXFag7EThairmT4a9ZDegFpwBrFgHODYT6N3dqS9gE5hg9ULJh0tkAjKROQFsYiaBW+YIqzgAS/d+xjt37DLNwYhGMYxPYdlN/FwDg37Ao5wNkSqfYPJEamfbMK1VBDwVXA=="}

获取实验Demo源代码,关注公众号,回复alipay


经验分享

  1. 以下接口蚂蚁金服支付宝答复已经下线,不再接受新签约单笔转账可以转账到用户的银行账户

    网银直连 直连网银

  2. 沙盒问题:RSA2所需要的支付宝公钥证书找不到

所使用的Alipay SDK POM

        <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->        <dependency>            <groupId>com.alipay.sdk</groupId>            <artifactId>alipay-sdk-java</artifactId>            <version>4.6.0.ALL</version>        </dependency>

官方电脑网站支付 Demo

https://docs.open.alipay.com/270/106291/

官方展示的代码是java jsp版本,非RSA2证书版本

RAS证书版本对接所用到参数

APPID应用私钥 (private key)应用公钥证书(public key cert)支付宝公钥(alipay public key)支付宝公钥证书(alipay public key cert)支付宝根证书(alipay root cert)AES Key

 示范代码片段

构建一个配置好证书的AlipayClient,之后与alipay gateway交互通过TA来进行。展示的版本是配置Aes key的,对发出去的报文进行了加密​。加密解密都是一个Aes key​。看sdk源代码,这两个key是分开的,但是使用的时候又当一成是一样的使用了。

构建AlipayClient

private AlipayClient buildAlipayClient() throws Exception {    // 构造client    CertAlipayRequest certAlipayRequest = new CertAlipayRequest();    // 设置网关地址    certAlipayRequest.setServerUrl(gateway);    // 设置应用Id    certAlipayRequest.setAppId(appId);    // 设置应用私钥    certAlipayRequest.setPrivateKey(privateKey);    // 设置请求格式,固定值json    certAlipayRequest.setFormat(AlipayConstants.FORMAT_JSON);    // 设置字符集    certAlipayRequest.setCharset(AlipayConstants.CHARSET_UTF8);    // 设置签名类型    certAlipayRequest.setSignType(AlipayConstants.SIGN_TYPE_RSA2);    // 设置应用公钥证书路径    certAlipayRequest.setCertPath(appCertPath);    // 设置支付宝公钥证书路径    certAlipayRequest.setAlipayPublicCertPath(alipayCertPath);    // 设置支付宝根证书路径    certAlipayRequest.setRootCertPath(alipayRootCertPath);    // 构造client    certAlipayRequest.setEncryptor(aesKey);    certAlipayRequest.setEncryptType(AlipayConstants.ENCRYPT_TYPE_AES);    return new DefaultAlipayClient(certAlipayRequest);  }

调用接口

所有的接口调用,命名都跟官方文档的一样,有规律可​循。来来来,先看一​小段代码片段。以查询​转账结果为例。

转账查询代码

  public String transferQuery(String bizNo) throws Exception{    AlipayClient alipayClient = buildAlipayClient();    AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest();    AlipayFundTransOrderQueryModel model = new AlipayFundTransOrderQueryModel();    model.setOutBizNo(bizNo);    request.setBizModel(model); //划重点    request.setNeedEncrypt(true);//划重点    AlipayFundTransOrderQueryResponse response= alipayClient.certificateExecute(request);    // 在这里检查订单的状态值    return  response.getBody();  }

官方文档的https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query的接口命名正好是sdk中的xxxModel,xxxRequeset,xxxResponse,按着接口命名来,调用起来​就顺了。
之于,网上DIY一个AlipayOrderBean,自己设置JsonFeild指定实体的json别名,也是做重复工作了,sdk已经配置好了,只需要直接调用即可。从内部系统到外部系统,这个地方还值得考虑一下​。
Aes加密解密,sdk 内置了,只要配置一下aes密钥就好,不需要自己重复造个轮子​啦。可参考上面的示例代码片段。
最大的坑
支付宝公钥证书(alipay public key cert),这个是要求提供的,在沙盒环境配置界面,找不到下载入口。​怎么破?直接使用的正式环境,还好有个正式上线的商户账号​。正式的帐号可以通过安装一个开源商城,快速通过审核获取到​。^_^
最不习惯的变化
好久没有接支付的,变得越来越快了,网银直连下线了不说,现在竟然中tradePagePay,返回的不是跳转地址了,直接一个完整的html,看到这个返回结果,顿时崩溃,以为见到鬼了~
开源与分享
本次支付宝对接采用了RSA2+AES,踩的坑也不少,做为实验练习代码demo已经整合在jblog中,后续还会完善​。从产品的角度来讲,代码谈不上。做为免费开源的代码来讲,可以防坑~~
获取源代码,关注公众号回复 code

jblog集成RSA2支付宝接口经验分享 | 无坑不支付 证书最绕人 | 蚂蚁沙盒更愁人

本次集成支付宝采用了最高规格的RSA2证书版本,折腾了许久,踩了一堆坑。也算是暂时接通了一下即时到账接口。采用RSA2证书版,主要是看中转帐功能。

查看效果:https://i.zuime.com

说明:本次实验的是直接下单,到支付宝支付,返回​。这条​线是通的。

采坑​记录:

返回错误:

{“alipay_trade_query_response”:{“code”:”40006″,”msg”:”Insufficient Permissions”,”sub_code”:”isv.insufficient-isv-permissions”,”sub_msg”:”ISV权限不足,建议在开发者中心检查应用是否上线”},”alipay_cert_sn”:”d129f75444e247d1fd7641eca25e8e8e”,”sign”:”T0OOwb6ij+QLwMYDeGyt5gTnopwth0RyyskjE2/OVd8mPNvDAEfcWHqtZ3eYRXwTTsKjKJZ9HceCXHtc8ZpjG4BJMVjDWO3MrOxXSEnBgPKZOIAS/2zL7EDrruaEc78CewFf5Id0IkY+tRTI61DaETuspfxF6JaZnu25n2qVc55H32GOFnWl3EWE6rS2nBgVBxGQKBo/KasOeafaJMuxP6/cLm4nLVO57bdcMwiZP+eNHNWurFru2AXyWELLrJdyjyQMqEri13SPdcrd0S3L+vA0KyC/bPavPAObJFKhVO1Z2xQ5YZBpYh6cOha8Mhd59s99CzlkuB/Zz6qvNvaVkw==”}

问题:

蚂蚁金服沙箱测试:无效的AppID参数

https://blog.csdn.net/JinglongSource/article/details/88703105

{“alipay_trade_query_response”:{“code”:”40002″,”msg”:”Invalid Arguments”,”sub_code”:”isv.app-cert-not-exist”,”sub_msg”:”应用公钥证书不存在”}}

{“alipay_trade_query_response”:{“code”:”40004″,”msg”:”Business Failed”,”sub_code”:”ACQ.INVALID_PARAMETER”,”sub_msg”:”参数无效”},”alipay_cert_sn”:”d129f75444e247d1fd7641eca25e8e8e”,”sign”:”FyFMLDXe7mnjI61eTVeMdsQLPYm4kdrGbWuPPu1vWDzryusC/NPD2K+pHzDdU9/0BHsImaejLbbcrs4Im+CbEEtB98I0L72nwG9mktx3ZM3OAqJ933cQPjc9xKv8d5aWU61kIzPjc19nBciGtdwUQqHPMus1V1egoMNl+DHt4F73ckEGe+j0VsXxRorj0iONEnGLwVg3sgcqwUVyxgelibcWCE5UNULZvBpTo88AXu07hnYQ9Bi9Amtuv7og8jPcGmPE8x874eblJDZWW8DNmLTZB5KMNYJb+LG1lfMBUK9cmzS/L5hQk7lp17D5cr1HMA9CBKgX7rQ27+V4kZ07jA==”}

{“alipay_trade_query_response”:{“code”:”40004″,”msg”:”Business Failed”,”sub_code”:”ACQ.INVALID_PARAMETER”,”sub_msg”:”参数无效:支付宝订单号和外部订单号不能同时为空”,”buyer_pay_amount”:”0.00″,”invoice_amount”:”0.00″,”point_amount”:”0.00″,”receipt_amount”:”0.00″},”alipay_cert_sn”:”d129f75444e247d1fd7641eca25e8e8e”,”sign”:”pfAb0deXjEFFIUhm56wCwZtbGc2Hw49glCp5zILfOIUxtmWUnSEJIGTRw2t/NMbbJNUmdJDgN2KB0+Mbek4LjtkBzvKdpjjR9dGNmEQHHkm+0aNdjVfjaKHJSq8mY6pseXelLKhFbGZCXwZ8MjXX/0njpFNRqUWEkyz0XsxDurfWtQWUKU7n4COB1qi7SsqEML07/AxGzQvAHwB4CJz4MNNUmqqSumwg9eHcOkDUcISYR+9nESQ3ob1f6l0IRX19ycMuPkLS+Nsm8gOBGinxtEkEASjvRsVFb85Z46f8I9EHl1E3+S1eqAmB1oY6kirOrFQAZMhhzrPodN8ksP2YnA==”}

The attribute value is undefined for the annotation type JSONField

{“alipay_trade_query_response”:{“code”:”40004″,”msg”:”Business Failed”,”sub_code”:”ACQ.TRADE_NOT_EXIST”,”sub_msg”:”交易不存在”,”buyer_pay_amount”:”0.00″,”invoice_amount”:”0.00″,”out_trade_no”:”Test1568206863310″,”point_amount”:”0.00″,”receipt_amount”:”0.00″},”alipay_cert_sn”:”d129f75444e247d1fd7641eca25e8e8e”,”sign”:”OPDujMVlLZbyxgbkNI9Mq+wunxBbIYrYoMxc+QcNVUY91whTIKePgly6AsZkd4pZA6hHf7y0uRvYcuGnAVGB5jBxmnMo+H8lcBkHySeLLMeQqeJPkejOo/3BJtYIb2ccMffdZ6MWFZd1fGlCsBEG8QD9mGUyA2K9vB3ooZqcgvI+2jWV0iFBVkzAYsYZk938pmjpFHEtLFDrqCGIc/6Bae6oO1Yfguk8RaAnB91fqVD+3Pli46/oLK7HVHTBlmBSf6NzzE05ijZgp1G4l9POAfN6RXMHu46oNx1fuC5HGfS4ySKsJ2H5Cj9rlXr8m/mZ7pLRplgLYKWq9xEzCFciPQ==”}

明天再续~~

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(八):配置中心服务化和高可用

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/22 并不影响保质期。一起了解一下Spring Cloud

在前两篇的介绍中,客户端都是直接调用配置中心的server端来获取配置文件信息。这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,server端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理的理念。springcloud提供了这样的解决方案,我们只需要将server端当做一个服务注册到eureka中,client端去eureka中去获取配置中心server端的服务既可。

这篇文章我们基于配置中心git版本的内容来改造

server端改造

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>
</dependencies>

需要多引入spring-cloud-starter-eureka包,来添加对eureka的支持。

2、配置文件

server:
server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: username                                        # git仓库的账号
          password: password                                    # git仓库的密码
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注册中心eurka地址

增加了eureka注册中心的配置

3、启动类

启动类添加@EnableDiscoveryClient激活对注册中心的支持

@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

这样server端的改造就完成了。先启动eureka注册中心,在启动server端,在浏览器中访问:http://localhost:8000/ 就会看到server端已经注册了到注册中心了。

按照上篇的测试步骤对server端进行测试服务正常。

客户端改造

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

需要多引入spring-cloud-starter-eureka包,来添加对eureka的支持。

2、配置文件

spring.application.name=spring-cloud-config-client
server.port=8002

spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=spring-cloud-config-server

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

主要是去掉了spring.cloud.config.uri直接指向server端地址的配置,增加了最后的三个配置:

  • spring.cloud.config.discovery.enabled :开启Config服务发现支持
  • spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
  • eureka.client.serviceUrl.defaultZone :指向注册中心的地址

这三个配置文件都需要放到bootstrap.properties的配置中

3、启动类

启动类添加@EnableDiscoveryClient激活对配置中心的支持

@EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientApplication {

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

启动client端,在浏览器中访问:http://localhost:8000/ 就会看到server端和client端都已经注册了到注册中心了。

高可用

为了模拟生产集群环境,我们改动server端的端口为8003,再启动一个server端来做服务的负载,提供高可用的server端支持。

如上图就可发现会有两个server端同时提供配置中心的服务,防止某一台down掉之后影响整个系统的使用。

我们先单独测试服务端,分别访问:http://localhost:8001/neo-config/devhttp://localhost:8003/neo-config/dev返回信息:

{
    "name": "neo-config",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "https://github.com/ityouknow/spring-cloud-starter/config-repo/neo-config-dev.properties",
            "source": {
                "neo.hello": "hello im dev"
            }
        }
    ]
}

说明两个server端都正常读取到了配置信息。

再次访问:http://localhost:8002/hello,返回:hello im dev update。说明客户端已经读取到了server端的内容,我们随机停掉一台server端的服务,再次访问http://localhost:8002/hello,返回:hello im dev update,说明达到了高可用的目的。

示例代码-github

示例代码-码云​

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(七):配置中心svn示例和refresh

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/23 并不影响保质期。一起了解一下Spring Cloud

上一篇springcloud(六):配置中心git示例留了一个小问题,当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,这个问题我们先放下,待会再讲。国内很多公司都使用的svn来做代码的版本控制,我们先介绍以下如何使用svn+Spring Cloud Config来做配置中心。

svn版本

同样先示例server端的代码,基本步骤一样。

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
	<dependency>
		<groupId>org.tmatesoft.svnkit</groupId>
		<artifactId>svnkit</artifactId>
	</dependency>
</dependencies>

需要多引入svnkitr包

2、配置文件

server:
  port: 8001

spring:
  cloud:
    config:
      server:
        svn:
          uri: http://192.168.0.6/svn/repo/config-repo
          username: username
          password: password
        default-label: trunk
  profiles:
    active: subversion
  application:
    name: spring-cloud-config-server

和git版本稍有区别,需要显示声明subversion.

3、启动类

启动类没有变化,添加@EnableConfigServer激活对配置中心的支持

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

4、测试

服务端测试

访问:http://localhost:8001/neo-config-dev.properties,返回:neo.hello: hello im dev,说明服务端可以正常读取到svn代码库中的配置信息。修改配置文件neo-config-dev.properties中配置信息为:neo.hello=hello im dev update,再次在浏览器访问http://localhost:8001/neo-config-dev.properties,返回:neo.hello: hello im dev update。说明server端会自动读取最新提交的内容

客户端测试

客户端直接使用上一篇示例项目spring-cloud-config-client来测试,配置基本不用变动。启动项目后访问:http://localhost:8002/hello,返回:hello im dev update说明已经正确的从server端获取到了参数。同样修改svn配置并提交,再次访问http://localhost:8002/hello“依然获取的是旧的信息,和git版本的问题一样。

refresh

现在来解决上一篇的遗留问题,这个问题在svn版本中依然存在。Spring Cloud Config分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置。客户端如何去主动获取新的配置信息呢,springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh

修改spring-cloud-config-client项目已到达可以refresh的功能。

1、添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh的功能。

2、 开启更新机制

需要给加载变量的类上面加载@RefreshScope,在客户端执行/refresh的时候就会更新此类下面的变量值。

@RestController
@RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
class HelloController {

    @Value("${neo.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

3、测试

springboot 1.5.X 以上默认开通了安全认证,所以需要在配置文件application.properties添加以下配置

management.security.enabled=false

OK 这样就改造完了,以post请求的方式来访问http://localhost:8002/refresh 就会更新修改后的配置文件。

我们再次来测试,首先访问http://localhost:8002/hello,返回:hello im dev,我将库中的值修改为hello im dev update。在win上面打开cmd执行curl -X POST http://localhost:8002/refresh,返回["neo.hello"]说明已经更新了neo.hello的值。我们再次访问http://localhost:8002/hello,返回:hello im dev update,客户端已经得到了最新的值。

每次手动刷新客户端也很麻烦,有没有什么办法只要提交代码就自动调用客户端来更新呢,github的webhook是一个好的办法。

4、webhook

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。Webhook来监测你在Github.com上的各种事件,最常见的莫过于push事件。如果你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的地址。

如此一来,你就可以通过这种方式去自动完成一些重复性工作,比如,你可以用Webhook来自动触发一些持续集成(CI)工具的运作,比如Travis CI;又或者是通过 Webhook 去部署你的线上服务器。下图就是github上面的webhook配置。

  • Payload URL :触发后回调的URL
  • Content type :数据格式,两种一般使用json
  • Secret :用作给POST的body加密的字符串。采用HMAC算法
  • events :触发的事件列表。
events事件类型 描述
push 仓库有push时触发。默认事件
create 当有分支或标签被创建时触发
delete 当有分支或标签被删除时触发

svn也有类似的hook机制,每次提交后会触发post-commit脚本,我们可以在这里写一些post请求

这样我们就可以利用hook的机制去触发客户端的更新,但是当客户端越来越多的时候hook支持的已经不够优雅,另外每次增加客户端都需要改动hook也是不现实的。其实Spring Cloud给了我们更好解决方案,后面文章来介绍。

示例代码-github

示例代码-码云

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(六):配置中心git示例

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/01 并不影响保质期。一起了解一下Spring Cloud

随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多。某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错。配置中心便是解决此类问题的灵丹妙药。

市面上开源的配置中心有很多,BAT每家都出过,360的QConf、淘宝的diamond、百度的disconf都是解决这类问题。国外也有很多开源的配置中心Apache Commons Configuration、owner、cfg4j等等。这些开源的软件以及解决方案都很优秀,但是我最钟爱的却是Spring Cloud Config,因为它功能全面强大,可以无缝的和spring体系相结合,够方便够简单颜值高我喜欢。

Spring Cloud Config

在我们了解spring cloud config之前,我可以想想一个配置中心提供的核心功能应该有什么

  • 提供服务端和客户端支持
  • 集中管理各环境的配置文件
  • 配置文件修改之后,可以快速的生效
  • 可以进行版本管理
  • 支持大的并发查询
  • 支持各种语言

Spring Cloud Config可以完美的支持以上所有的需求。

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件,默认情况下使用git,我们先以git为例做一套示例。

首先在github上面创建了一个文件夹config-repo用来存放配置文件,为了模拟生产环境,我们创建以下三个配置文件:

// 开发环境
neo-config-dev.properties
// 测试环境
neo-config-test.properties
// 生产环境
neo-config-pro.properties

每个配置文件中都写一个属性neo.hello,属性值分别是 hello im dev/test/pro 。下面我们开始配置server端

server 端

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
</dependencies>

只需要加入spring-cloud-config-server包引用既可。

2、配置文件

server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址
          search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username:                                             # git仓库的账号
          password:                                             # git仓库的密码

Spring Cloud Config也提供本地存储配置的方式。我们只需要设置属性spring.profiles.active=native,Config Server会默认从应用的src/main/resource目录下检索配置文件。也可以通过spring.cloud.config.server.native.searchLocations=file:E:/properties/属性来指定配置文件的位置。虽然Spring Cloud Config提供了这样的功能,但是为了支持更好的管理内容和版本控制的功能,还是推荐使用git的方式。

3、启动类

启动类添加@EnableConfigServer,激活对配置中心的支持

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

到此server端相关配置已经完成

4、测试

首先我们先要测试server端是否可以读取到github上面的配置信息,直接访问:http://localhost:8001/neo-config/dev

返回信息如下:

{
    "name": "neo-config",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "https://github.com/ityouknow/spring-cloud-starter/config-repo/neo-config-dev.properties",
            "source": {
                "neo.hello": "hello im dev"
            }
        }
    ]
}

上述的返回的信息包含了配置文件的位置、版本、配置文件的名称以及配置文件中的具体内容,说明server端已经成功获取了git仓库的配置信息。

如果直接查看配置文件中的配置信息可访问:http://localhost:8001/neo-config-dev.properties,返回:neo.hello: hello im dev

修改配置文件neo-config-dev.properties中配置信息为:neo.hello=hello im dev update,再次在浏览器访问http://localhost:8001/neo-config-dev.properties,返回:neo.hello: hello im dev update。说明server端会自动读取最新提交的内容

仓库中的配置文件会被转换成web接口,访问可以参照以下的规则:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

以neo-config-dev.properties为例子,它的application是neo-config,profile是dev。client会根据填写的参数来选择读取对应的配置。

client 端

主要展示如何在业务项目中去获取server端的配置信息

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

引入spring-boot-starter-web包方便web测试

2、配置文件

需要配置两个配置文件,application.properties和bootstrap.properties

application.properties如下:

spring.application.name=spring-cloud-config-client
server.port=8002

bootstrap.properties如下:

spring.cloud.config.name=neo-config
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8001/
spring.cloud.config.label=master
  • spring.application.name:对应{application}部分
  • spring.cloud.config.profile:对应{profile}部分
  • spring.cloud.config.label:对应git的分支。如果配置中心使用的是本地存储,则该参数无用
  • spring.cloud.config.uri:配置中心的具体地址
  • spring.cloud.config.discovery.service-id:指定配置中心的service-id,便于扩展为高可用配置集群。

特别注意:上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为config的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。

3、启动类

启动类添加@EnableConfigServer,激活对配置中心的支持

@SpringBootApplication
public class ConfigClientApplication {

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

启动类只需要@SpringBootApplication注解就可以

4、web测试

使用@Value注解来获取server端参数的值

@RestController
class HelloController {
    @Value("${neo.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

启动项目后访问:http://localhost:8002/hello,返回:hello im dev update说明已经正确的从server端获取到了参数。到此一个完整的服务端提供配置服务,客户端获取配置参数的例子就完成了。

我们在进行一些小实验,手动修改neo-config-dev.properties中配置信息为:neo.hello=hello im dev update1提交到github,再次在浏览器访问http://localhost:8002/hello,返回:neo.hello: hello im dev update,说明获取的信息还是旧的参数,这是为什么呢?因为springboot项目只有在启动的时候才会获取配置文件的值,修改github信息后,client端并没有在次去获取,所以导致这个问题。如何去解决这个问题呢?留到下一章我们在介绍。

示例代码-github

示例代码-码云

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗 他山之石,可以攻玉系列|springcloud(五):熔断监控Hystrix Dashboard和Turbine

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/18 并不影响保质期。一起了解一下Spring Cloud

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine.

Hystrix Dashboard

我们在熔断示例项目spring-cloud-consumer-hystrix的基础上更改,重新命名为:spring-cloud-consumer-hystrix-dashboard。

1、添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

这三个包必须添加

2、启动类

启动类添加启用Hystrix Dashboard和熔断器

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableCircuitBreaker
public class ConsumerApplication {

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

3、测试

启动工程后访问 http://localhost:9001/hystrix,将会看到如下界面:

图中会有一些提示:

Cluster via Turbine (default cluster): http://turbine-hostname:port/turbine.stream
Cluster via Turbine (custom cluster): http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
Single Hystrix App: http://hystrix-app:port/hystrix.stream

大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入:http://localhost:9001/hystrix.stream ,输入之后点击 monitor,进入页面。

如果没有请求会先显示Loading ...,访问http://localhost:9001/hystrix.stream 也会不断的显示ping。

请求服务http://localhost:9001/hello/neo,就可以看到监控的效果了,首先访问http://localhost:9001/hystrix.stream,显示如下:

ping:

data: {"type":...}

data: {"type":...}

说明已经返回了监控的各项结果

到监控页面就会显示如下图:

其实就是http://localhost:9001/hystrix.stream返回结果的图形化显示,Hystrix Dashboard Wiki上详细说明了图上每个指标的含义,如下图:

到此单个应用的熔断监控已经完成。

Turbine

在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。为此,Netflix提供了一个开源项目(Turbine)来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。

1、添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-turbine</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-netflix-turbine</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
	</dependency>
</dependencies>

2、配置文件

spring.application.name=hystrix-dashboard-turbine
server.port=8001
turbine.appConfig=node01,node02
turbine.aggregator.clusterConfig= default
turbine.clusterNameExpression= new String("default")

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
  • turbine.appConfig :配置Eureka中的serviceId列表,表明监控哪些服务
  • turbine.aggregator.clusterConfig :指定聚合哪些集群,多个使用”,”分割,默认为default。可使用http://.../turbine.stream?cluster={clusterConfig之一}访问
  • turbine.clusterNameExpression :1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称;2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default;3. 当clusterNameExpression: metadata[‘cluster’]时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC

3、启动类

启动类添加@EnableTurbine,激活对Turbine的支持

@SpringBootApplication
@EnableHystrixDashboard
@EnableTurbine
public class DashboardApplication {

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

}

到此Turbine(hystrix-dashboard-turbine)配置完成

4、测试

在示例项目spring-cloud-consumer-hystrix基础上修改为两个服务的调用者spring-cloud-consumer-node1和spring-cloud-consumer-node2

spring-cloud-consumer-node1项目改动如下:application.properties文件内容

spring.application.name=node01
server.port=9001
feign.hystrix.enabled=true

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

spring-cloud-consumer-node2项目改动如下:application.properties文件内容

spring.application.name=node02
server.port=9002
feign.hystrix.enabled=true

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

HelloRemote类修改:

@FeignClient(name= "spring-cloud-producer2", fallback = HelloRemoteHystrix.class)
public interface HelloRemote {

    @RequestMapping(value = "/hello")
    public String hello2(@RequestParam(value = "name") String name);

}

对应的HelloRemoteHystrixConsumerController类跟随修改,具体查看代码

修改完毕后,依次启动spring-cloud-eureka、spring-cloud-consumer-node1、spring-cloud-consumer-node1、hystrix-dashboard-turbine(Turbine)

打开eureka后台可以看到注册了三个服务:

访问 http://localhost:8001/turbine.stream

返回:

: ping
data: {"reportingHostsLast10Seconds":1,"name":"meta","type":"meta","timestamp":1494921985839}

并且会不断刷新以获取实时的监控数据,说明和单个的监控类似,返回监控项目的信息。进行图形化监控查看,输入:http://localhost:8001/hystrix,返回酷酷的小熊界面,输入:http://localhost:8001/turbine.stream,然后点击 Monitor Stream ,可以看到出现了俩个监控列表

示例代码-github

示例代码-码云

参考:

使用Spring Cloud与Docker实战微服务

 

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(四):熔断器Hystrix

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/16 并不影响保质期。一起了解一下Spring Cloud

说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事。

熔断器

雪崩效应

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

熔断器(CircuitBreaker)

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

熔断器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。熔断器开关相互转换的逻辑如下图:

熔断器就是保护服务高可用的最后一道防线。

Hystrix特性

1.断路器机制

断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.

2.Fallback

Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.

3.资源隔离

在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.

Feign Hystrix

因为熔断只是作用在服务调用这一端,因此我们根据上一篇的示例代码只需要改动spring-cloud-consumer项目相关代码就可以。因为,Feign中已经依赖了Hystrix所以在maven配置上不用做任何改动。

1、配置文件

application.properties添加这一条:

feign.hystrix.enabled=true

2、创建回调类

创建HelloRemoteHystrix类继承与HelloRemote实现回调的方法

@Component
public class HelloRemoteHystrix implements HelloRemote{

    @Override
    public String hello(@RequestParam(value = "name") String name) {
        return "hello" +name+", this messge send failed ";
    }
}

3、添加fallback属性

HelloRemote类添加指定fallback类,在服务熔断的时候返回fallback类中的内容。

@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class)
public interface HelloRemote {

    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);

}

改动点就这点,很简单吧。

4、测试

那我们就来测试一下看看效果吧。

依次启动spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三个项目。

浏览器中输入:http://localhost:9001/hello/neo

返回:hello neo,this is first messge

说明加入熔断相关信息后,不影响正常的访问。接下来我们手动停止spring-cloud-producer项目再次测试:

浏览器中输入:http://localhost:9001/hello/neo

返回:hello neo, this messge send failed

根据返回结果说明熔断成功。

示例代码-github

示例代码-码云

参考:

使用Spring Cloud与Docker实战微服务

微服务框架Spring Cloud介绍 Part5: 在微服务系统中使用Hystrix, Hystrix Dashboard与Turbine

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(三):服务提供与调用

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/12 并不影响保质期。一起了解一下Spring Cloud

上一篇文章我们介绍了eureka服务注册中心的搭建,这篇文章介绍一下如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例。

案例中有三个角色:服务注册中心、服务提供者、服务消费者,其中服务注册中心就是我们上一篇的eureka单机版启动既可,流程是首先启动注册中心,服务提供者生产服务并注册到服务中心中,消费者从服务中心中获取服务并执行。

服务提供

我们假设服务提供者有一个hello方法,可以根据传入的参数,提供输出“hello xxx,this is first messge”的服务

1、pom包配置

创建一个springboot项目,pom.xml中添加如下配置:

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

2、配置文件

application.properties配置如下:

spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

参数在上一篇都已经解释过,这里不多说。

3、启动类

启动类中添加@EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {

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

4、controller

提供hello服务

@RestController
public class HelloController {
	
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is first messge";
    }
}

添加@EnableDiscoveryClient注解后,项目就具有了服务注册的功能。启动工程后,就可以在注册中心的页面看到SPRING-CLOUD-PRODUCER服务。

到此服务提供者配置就完成了。

服务调用

1、pom包配置

和服务提供者一致

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

2、配置文件

application.properties配置如下:

spring.application.name=spring-cloud-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

3、启动类

启动类添加@EnableDiscoveryClient@EnableFeignClients注解。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

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

}
  • @EnableDiscoveryClient :启用服务注册与发现
  • @EnableFeignClients:启用feign进行远程调用

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

4、feign调用实现

@FeignClient(name= "spring-cloud-producer")
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);
}
  • name:远程服务名,及spring.application.name配置的名称

此类中的方法和远程服务中contoller中的方法名和参数需保持一致。

5、web层调用远程服务

将HelloRemote注入到controller层,像普通方法一样去调用即可。

@RestController
public class ConsumerController {

    @Autowired
    HelloRemote HelloRemote;
	
    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        return HelloRemote.hello(name);
    }

}

到此,最简单的一个服务注册与调用的例子就完成了。

测试

简单调用

依次启动spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三个项目

先输入:http://localhost:9000/hello?name=neo 检查spring-cloud-producer服务是否正常

返回:hello neo,this is first messge

说明spring-cloud-producer正常启动,提供的服务也正常。

浏览器中输入:http://localhost:9001/hello/neo

返回:hello neo,this is first messge

说明客户端已经成功的通过feign调用了远程服务hello,并且将结果返回到了浏览器。

负载均衡

以上面spring-cloud-producer为例子修改,将其中的controller改动如下:

@RestController
public class HelloController {
	
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is producer 2  send first messge";
    }
}

在配置文件中改动端口:

spring.application.name=spring-cloud-producer
server.port=9003
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

打包启动后,在eureka就会发现两个服务提供者,如下图:

然后在浏览器再次输入:http://localhost:9001/hello/neo 进行测试:

第一次返回结果:hello neo,this is first messge

第二次返回结果:hello neo,this is producer 2 send first messge

不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。

示例代码-github

示例代码-码云

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(二):注册中心Eureka

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/10。一起了解一下Spring Cloud!

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

背景介绍

服务中心

服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

有了服务中心调用关系会有什么变化,画几个简图来帮忙理解

项目A调用项目B

正常调用项目A请求项目B

有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用

项目A调用项目B,项目B在调用项目C

这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。

上面的项目只是两三个相互之间的简单调用,但是如果项目超过20个30个呢,在15年底的时候我司分布式的项目就达到了二十几个,画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

说Eureka之前我先八卦一下Netflix

Netflix

以下介绍来自于百度百科:

Netflix是一家美国公司,在美国、加拿大提供互联网随选流媒体播放,定制DVD、蓝光光碟在线出租业务。该公司成立于1997年,总部位于加利福尼亚州洛斯盖图,1999年开始订阅服务。2009年,该公司可提供多达10万部DVD电影,并有1千万的订户。2007年2月25日,Netflix宣布已经售出第10亿份DVD。HIS一份报告中表示,2011年Netflix网络电影销量占据美国用户在线电影总销量的45%。

我第一次看到这个单词的时候,是在各种美剧或者电影的开头,Netflix拍摄的代表性的美剧有《纸牌屋》、《毒枭》、《怪奇物语》。后来研究springcloud的时候发现了Netflix公司,就在想它们是不是同一家公司,经过核对github上面邮件后缀判定确实是同一家公司,其实springcloud的微服务就基于Netflix公司的开源产品来做的。

Netflix的开源框架组件已经在Netflix的大规模分布式微服务环境中经过多年的生产实战验证,正逐步被社区接受为构造微服务框架的标准组件。Spring Cloud开源产品,主要是基于对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务基础框架。对于一些打算构建微服务框架体系的公司来说,充分利用或参考借鉴Netflix的开源微服务组件(或Spring Cloud),在此基础上进行必要的企业定制,无疑是通向微服务架构的捷径。

Eureka

按照官方介绍:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.

Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

用一张图来认识以下:

上图简要描述了Eureka的基本架构,由3个角色组成:

1、Eureka Server

  • 提供服务注册和发现

2、Service Provider

  • 服务提供方
  • 将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer

  • 服务消费方
  • 从Eureka获取注册服务列表,从而能够消费服务

案例实践

Eureka Server

spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。

1、pom中添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka-server</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

2、添加启动代码中添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {

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

3、配置文件

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,在application.properties添加以下配置:

spring.application.name=spring-cloud-eureka

server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
  • eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
  • eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。
  • eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。

启动工程后,访问:http://localhost:8000/,可以看到下面的页面,其中还没有发现任何服务

集群

注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。

双节点注册中心

首次我们尝试一下双节点的注册中心的搭建。

1、创建application-peer1.properties,作为peer1服务中心的配置,并将serviceUrl指向peer2

spring.application.name=spring-cloud-eureka
server.port=8000
eureka.instance.hostname=peer1

eureka.client.serviceUrl.defaultZone=http://peer2:8001/eureka/

2、创建application-peer2.properties,作为peer2服务中心的配置,并将serviceUrl指向peer1

spring.application.name=spring-cloud-eureka
server.port=8001
eureka.instance.hostname=peer2

eureka.client.serviceUrl.defaultZone=http://peer1:8000/eureka/

3、host转换

在hosts文件中加入如下配置

127.0.0.1 peer1  
127.0.0.1 peer2  

4、打包启动

依次执行下面命令

#打包
mvn clean package
# 分别以peer1和peeer2 配置信息启动eureka
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

依次启动完成后,浏览器输入:http://localhost:8000/ 效果图如下:

根据图可以看出peer1的注册中心DS Replicas已经有了peer2的相关配置信息,并且出现在available-replicas中。我们手动停止peer2来观察,发现peer2就会移动到unavailable-replicas一栏中,表示peer2不可用。

到此双节点的配置已经完成。

eureka集群使用

在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。

application.yml配置详情如下:

---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer1
server:
  port: 8000
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8001/eureka/,http://peer3:8002/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer2
server:
  port: 8001
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8000/eureka/,http://peer3:8002/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer3
server:
  port: 8002
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
      defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/

分别以peer1、peer2、peer3的配置参数启动eureka注册中心。

java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

依次启动完成后,浏览器输入:http://localhost:8000/ 效果图如下:

可以在peer1中看到了peer2、peer3的相关信息。至此eureka集群也已经完成了

示例代码-github

示例代码-码云

参考:

Peer Awareness

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处

Yuema约吗一起学习成长之路 他山之石,可以攻玉系列|springcloud(一):大话Spring Cloud

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

他山之石,可以攻玉!对,就是转载文章!文章由大佬推荐,以技术为圈,画个Spring的大圆!

作者博客【纯洁的微笑】的个人介绍: 2009年,因为数学建模接触编程。2010年,经过培训走入程序员行业。2010年-2013年,在西安工作过三年,主要集中在通讯领域。2013年,清明节开始北漂,北京六年主要在第三方支付和互联网金融公司从业。2014年,从零参与组建一个互联网金融公司,2015年成为互联网金融公司技术负责人。2016年,开始写博客;2017年,开通微信公众号;2018年,第三方支付公司研发副总。2019年,选择成为一名自由职业者,开始探索更多可能性。

纯洁的微笑博客发布于2017/05/01 并不影响保质期。一起了解一下Spring Cloud

研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud。在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用。

Spring Cloud是什么鬼?

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,springcloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,springcloud做为大管家需要管理好这些微服务,自然需要很多小弟来帮忙。

主要的小弟有:Spring Cloud Config、Spring Cloud Netflix(Eureka、Hystrix、Zuul、Archaius…)、Spring Cloud Bus、Spring Cloud for Cloud Foundry、Spring Cloud Cluster、Spring Cloud Consul、Spring Cloud Security、Spring Cloud Sleuth、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Zookeeper、Spring Cloud Connectors、Spring Cloud Starters、Spring Cloud CLI,每个小弟身怀独门绝技武功高强下面来做一一介绍。

核心成员

Spring Cloud Netflix

这可是个大boss,地位仅次于老大,老大各项服务依赖与它,与各种Netflix OSS组件集成,组成微服务的核心,它的小弟主要有Eureka, Hystrix, Zuul, Archaius… 太多了

Netflix Eureka

服务中心,云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。这个可是springcloud最牛鼻的小弟,服务中心,任何小弟需要其它小弟支持什么都需要从这里来拿,同样的你有什么独门武功的都赶紧过报道,方便以后其它小弟来调用;它的好处是你不需要直接找各种什么小弟支持,只需要到服务中心来领取,也不需要知道提供支持的其它小弟在哪里,还是几个小弟来支持的,反正拿来用就行,服务中心来保证稳定性和质量。

Netflix Hystrix

熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。比如突然某个小弟生病了,但是你还需要它的支持,然后调用之后它半天没有响应,你却不知道,一直在等等这个响应;有可能别的小弟也正在调用你的武功绝技,那么当请求多之后,就会发生严重的阻塞影响老大的整体计划。这个时候Hystrix就派上用场了,当Hystrix发现某个小弟不在状态不稳定立马马上让它下线,让其它小弟来顶上来,或者给你说不用等了这个小弟今天肯定不行,该干嘛赶紧干嘛去别在这排队了。

Netflix Zuul

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。当其它门派来找大哥办事的时候一定要先经过zuul,看下有没有带刀子什么的给拦截回去,或者是需要找那个小弟的直接给带过去。

Netflix Archaius

配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。可以实现动态获取配置, 原理是每隔60s(默认,可配置)从配置源读取一次内容,这样修改了配置文件后不需要重启服务就可以使修改后的内容生效,前提使用archaius的API来读取。

Spring Cloud Config

俗称的配置中心,配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。就是以后大家武器、枪火什么的东西都集中放到一起,别随便自己带,方便以后统一管理、升级装备。

Spring Cloud Bus

事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。相当于水浒传中日行八百里的神行太保戴宗,确保各个小弟之间消息保持畅通。

Spring Cloud for Cloud Foundry

Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题

其实就是与CloudFoundry进行集成的一套解决方案,抱了Cloud Foundry的大腿。

Spring Cloud Cluster

Spring Cloud Cluster将取代Spring Integration。提供在分布式系统中的集群所需要的基础功能支持,如:选举、集群的状态一致性、全局锁、tokens等常见状态模式的抽象和实现。

如果把不同的帮派组织成统一的整体,Spring Cloud Cluster已经帮你提供了很多方便组织成统一的工具。

Spring Cloud Consul

Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.

Spring Cloud Consul 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。

其它小弟

Spring Cloud Security

基于spring security的安全工具包,为你的应用程序添加安全控制。这个小弟很牛鼻专门负责整个帮派的安全问题,设置不同的门派访问特定的资源,不能把秘籍葵花宝典泄漏了。

Spring Cloud Sleuth

日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。

Spring Cloud Data Flow

  • Data flow 是一个用于开发和执行大范围数据处理其模式包括ETL,批量运算和持续运算的统一编程模型和托管服务。
  • 对于在现代运行环境中可组合的微服务程序来说,Spring Cloud data flow是一个原生云可编配的服务。使用Spring Cloud data flow,开发者可以为像数据抽取,实时分析,和数据导入/导出这种常见用例创建和编配数据通道 (data pipelines)。
  • Spring Cloud data flow 是基于原生云对 spring XD的重新设计,该项目目标是简化大数据应用的开发。Spring XD 的流处理和批处理模块的重构分别是基于 Spring Boot的stream 和 task/batch 的微服务程序。这些程序现在都是自动部署单元而且他们原生的支持像 Cloud Foundry、Apache YARN、Apache Mesos和Kubernetes 等现代运行环境。
  • Spring Cloud data flow 为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践。

Spring Cloud Stream

Spring Cloud Stream是创建消息驱动微服务应用的框架。Spring Cloud Stream是基于Spring Boot创建,用来建立单独的/工业级spring应用,使用spring integration提供与消息代理之间的连接。数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。

一个业务会牵扯到多个任务,任务之间是通过事件触发的,这就是Spring Cloud stream要干的事了

Spring Cloud Task

Spring Cloud Task 主要解决短命微服务的任务管理,任务调度的工作,比如说某些定时任务晚上就跑一次,或者某项数据分析临时就跑几次。

Spring Cloud Zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理,抱了Zookeeper的大腿。

Spring Cloud Connectors

Spring Cloud Connectors 简化了连接到服务的过程和从云平台获取操作的过程,有很强的扩展性,可以利用Spring Cloud Connectors来构建你自己的云平台。

便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。

Spring Cloud Starters

Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。

Spring Cloud CLI

基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。

和Spring Boot 是什么关系

Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring Boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,可以不基于Spring Boot吗?不可以。

Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。

spring -> spring boot > Spring Cloud 这样的关系。

Spring Cloud的优势

微服务的框架那么多比如:dubbo、Kubernetes,为什么就要使用Spring Cloud的呢?

  • 产出于spring大家族,spring在企业级开发框架中无人能敌,来头很大,可以保证后续的更新、完善。比如dubbo现在就差不多死了
  • 有Spring Boot 这个独立干将可以省很多事,大大小小的活Spring Boot都搞的挺不错。
  • 作为一个微服务治理的大家伙,考虑的很全面,几乎服务治理的方方面面都考虑到了,方便开发开箱即用。
  • Spring Cloud 活跃度很高,教程很丰富,遇到问题很容易找到解决方案
  • 轻轻松松几行代码就完成了熔断、均衡负载、服务中心的各种平台功能

Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当前Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

示例代码-github

示例代码-码云

作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权归作者所有,转载请注明出处