# spring_cloud_demo **Repository Path**: xuebusi/spring_cloud_demo ## Basic Information - **Project Name**: spring_cloud_demo - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-12 - **Last Updated**: 2021-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## SpringCloud微服务Demo ### 模块简介 #### 1. spring_cloud_demo ```text Maven父工程,这是一个聚合工程,用于管理各个子模块; ``` #### 2. eureka_server_standalone ```text 这是 spring_cloud_demo 下的一个 maven 子模块; 单机版的 eureka 注册中心; ``` #### 3. provider_service ```text 这是 spring_cloud_demo 下的一个 maven 子模块; 模拟微服务提供者,一个 eureka 客户端程序,提供一个查询商品详情的接口; 该微服务启动时将注册到 eureka_server_standalone 单机版的 eureka 注册中心; 浏览器访问 http://localhost:9001/product/1 来查看商品JSON数据如下: ``` ```json { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } ``` #### 4. consumer_service ```text 这是 spring_cloud_demo 下的一个 maven 子模块; 模拟微服务消费者,一个 eureka 客户端程序,内部会调用微服务 provider_service 的商品查询接口; 所以在启动本微服务之前,应先启动 provider_service 微服务; 该微服务启动时将注册到 eureka_server_standalone 单机版的 eureka 注册中心; 浏览器访问 http://localhost:9002/order/buy/1 可以查看详细的商品JSON信息如下: ``` ```json { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } ``` #### 5. eureka_server_cluster_01 和 eureka_server_cluster_02 ```text 子模块 eureka_server_cluster_01 和子模块 eureka_server_cluster_02 一起构成集群版的 eureka server, 启动时会二者相互注册从而构成高可用的 eureka 注册中心. 通过浏览器分别访问 http://localhost:8001/ 和 http://localhost:8002/ 可以确定两个注册中心是否相互注册成功. ``` ```text 集群版 eureka 注册中心高可用演示步骤: (1). 启动 eureka_server_cluster_01 和 eureka_server_cluster_02这两个eureka注册中心(二者互相注册保证高可用), (启动失败不要怕,等两者都启动成功就好了,因为二者在启动的过程中会相互注册,乙方启动的时候发现另一方还未启动成功就会报错), (2). 浏览器分别访问 http://localhost:8001/ 和 http://localhost:8002/ 确定两个注册中心已经相互注册; (2). 启动 provider_service (确定其配置文件中的注册中心地址是指向集群版的 eureka 注册中心地址); (3). 启动 consumer_service (确定其配置文件中的注册中心地址是指向集群版的 eureka 注册中心地址); (4). 浏览器访问 http://localhost:9002/order/buy/1 获取订单商品信息,将看到如下返回信息: ``` ```json { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } ``` ```text 这说明服务提供者和服务消费者都成功注册到集群版的 eureka 注册中心,服务调用时OK的,下面开始演示 eureka 注册中心高可用: ``` ```text (5). 停掉 eureka_server_cluster_01 注册中心,http://localhost:8001/ 将无法访问, 但访问 http://localhost:9002/order/buy/1 依然可以成功获取订单商品信息,说明注册中心的服务不受影响, 因为此时还有 eureka_server_cluster_02 这个注册中心在运行. (6). 再停掉 eureka_server_cluster_02 注册中心,http://localhost:8002/ 将无法访问, 但访问 http://localhost:9002/order/buy/1 依然可以成功获取订单商品信息, 因为 consumer_service 本地会缓存一份服务注册表,服务调用依然不会受到影响. ``` #### 6. ribbon_consumer_service ```text 这是 spring_cloud_demo 下的一个 maven 子模块; 模拟微服务消费者,一个 eureka 客户端程序,主要测试如何使用Ribbon调用远程服务; 所以在启动本微服务之前,应先启动 provider_service 微服务; 步骤如下: (1). 启动eureka_server_cluster_01和eureka_server_cluster_02这两个eureka注册中心(二者互相注册保证高可用), (启动失败不要怕,等两者都启动成功就好了,因为二者在启动的过程中会相互注册,乙方启动的时候发现另一方还未启动成功就会报错), (2). 启动provider_service微服务,该服务主要提供商品查询服务; (3). 启动ribbon_consumer_service微服务,浏览器访问http://localhost:9003/order/buy/1 调用provider_service微服务中的商品信息,如果成功返回如下JSON数据,说明使用ribbon调用远程服务成功: ``` ```json { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } ``` #### 7. RibbonLoadBalanceConsumer、RibbonLoadBalanceProvider01和RibbonLoadBalanceProvider02 ```text 这3个工程主要用于演示ribbon的负载均衡功能。 其中RibbonLoadBalanceProvider01和RibbonLoadBalanceProvider02是服务提供方, 用于模拟同一个服务启动的两个进程,RibbonLoadBalanceConsumer工程作为服务消费方, 会使用Ribbon调用服务,并在两个提供者进程之间进行负载均衡,测试步骤如下: (1). 启动eureka_server_cluster_01和eureka_server_cluster_02这两个eureka注册中心(二者互相注册保证高可用), (启动失败不要怕,等两者都启动成功就好了,因为二者在启动的过程中会相互注册,乙方启动的时候发现另一方还未启动成功就会报错), 访问http://localhost:8001/和http://localhost:8002/可以查看eureka注册中心是否成功相互注册; (2). 启动两个服务提供者RibbonLoadBalanceProvider01和RibbonLoadBalanceProvider02, 并通过eureka界面查看RIBBON-LOAD-BALANCE-PROVIDER服务下是否有两个ip地址+端口 分别为`192.168.1.103:9005` 和 `192.168.1.103:9004`; (3). 启动服务消费方RibbonLoadBalanceConsumer,浏览器访问http://localhost:9006/order/buy/1看是否成功返回JSON格式数据。 当不断刷新页面时,返回结果会在如下两个JSON之间进行切换(观察message字段中ip地址和端口号的变化情况),证明ribbon负载均衡生效: ``` ```json { "time": "2021-03-12 12:20:52", "message": "192.168.1.103:9004", "data": { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } } ``` ```json { "time": "2021-03-12 12:20:56", "message": "192.168.1.103:9005", "data": { "id": 1, "productName": "小米电视4A", "status": 1, "price": 3499, "productDesc": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "caption": "70英寸 4K超高清 HDR 二级能效 2GB+16GB L70M5-4A 内置小爱 智能网络液晶平板教育电视", "inventory": 999 } } ``` ```text 要使用Ribbon的重试功能,首先需要在服务消费方引入spring-retry依赖,并在application.properties中进行一些配置: # ribbon连接超时时间,单位毫秒,默认值1000(其中 ribbon-load-balance-provider 为需要调用的微服务名称) ribbon-load-balance-provider.ribbon.ConnectTimeout=1000 # ribbon的数据读取超时时间,单位毫秒,默认值1000 ribbon-load-balance-provider.ribbon.ReadTimeout=3000 # 是否对所有操作都重试,true对所有请求重试,false只对GET请求重试 ribbon-load-balance-provider.ribbon.OkToRetryOnAllOperations=true # 切换实例的重试次数,默认值1 ribbon-load-balance-provider.ribbon.MaxAutoRetriesNextServer=1 # 对当前实例的重试次数,默认值0 # 配置为1表示当该服务实例调用失败则不再重试调用本实例而是调用其他实例 ribbon-load-balance-provider.ribbon.MaxAutoRetries=1 演示Ribbon的重试功能,步骤如下: (1). 启动eureka_server_cluster_01和eureka_server_cluster_02这两个eureka注册中心(二者互相注册保证高可用), (启动失败不要怕,等两者都启动成功就好了,因为二者在启动的过程中会相互注册,乙方启动的时候发现另一方还未启动成功就会报错), 访问http://localhost:8001/和http://localhost:8002/可以查看eureka注册中心是否成功相互注册; (2). 启动两个服务提供者RibbonLoadBalanceProvider01和RibbonLoadBalanceProvider02, 并通过eureka界面查看RIBBON-LOAD-BALANCE-PROVIDER服务下是否有两个ip地址+端口 分别为`192.168.1.103:9005` 和 `192.168.1.103:9004`; (3). 启动服务消费方RibbonLoadBalanceConsumer,浏览器访问http://localhost:9006/order/buy/1看是否成功返回JSON格式数据。 当不断刷新页面时,返回结果会在如下两个JSON之间进行切换(观察message字段中ip地址和端口号的变化情况),证明ribbon负载均衡生效 (4). 如果停掉RibbonLoadBalanceProvider01服务实例(9004端口),并通过浏览器不断刷新请求http://localhost:9006/order/buy/1时, 会发现ribbon不再调用RibbonLoadBalanceProvider01实例,而只调用RibbonLoadBalanceProvider02实例(9005端口); 相反,如果停掉RibbonLoadBalanceProvider02实例,会发现ribbon只会调用RibbonLoadBalanceProvider01实例, 而不再调用RibbonLoadBalanceProvider02实例。这就说明ribbon的重试机制已经生效了。 ``` #### 8. FeignConsumerService ```text 该工程用来演示Feign的使用方式。 Feign的使用只需要如下4步: (1). 引入spring-cloud-starter-openfeign依赖; (2). 在启动类上加上@EnableFeignClients注解; (3). 定义Feign接口,参考 com.xuebusi.feign.consumer.feign.ProductFeignService (4). 使用@Autowired或@Resource注入,直接调用接口方法即可; 具体演示过程如下: (1). 启动eureka_server_cluster_01和eureka_server_cluster_02这两个eureka注册中心(二者互相注册保证高可用), (启动失败不要怕,等两者都启动成功就好了,因为二者在启动的过程中会相互注册,乙方启动的时候发现另一方还未启动成功就会报错), 访问http://localhost:8001/和http://localhost:8002/可以查看eureka注册中心是否成功相互注册; (2). 启动两个服务提供者RibbonLoadBalanceProvider01和RibbonLoadBalanceProvider02, 并通过eureka界面查看RIBBON-LOAD-BALANCE-PROVIDER服务下是否有两个ip地址+端口 分别为`192.168.1.103:9005` 和 `192.168.1.103:9004`; (3). 启动服务消费方FeignConsumerService(9007端口),浏览器访问http://localhost:9007/order/buy/1 如果返回JSON数据,则证明Feign调用远程服务成功; ```