SpringCloud demo (极速- 入门)
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《尼恩Java面试宝典 最新版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
推荐: 地表最强 开发环境 系列
工欲善其事 必先利其器 |
---|
地表最强 开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解) |
地表最强 热部署:java SpringBoot SpringCloud 热部署 热加载 热调试 |
地表最强 发请求工具(再见吧, PostMan ):IDEA HTTP Client(史上最全) |
地表最强 PPT 小工具: 屌炸天,像写代码一样写PPT |
无编程不创客,无编程不创客,一大波编程高手正在疯狂创客圈交流、学习中! 找组织,GO |
SpringCloud 全家桶简介
SpringCloud 全家桶是 Pivotal 团队提供的一整套微服务开源解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、断路器等组件,以上的组件主要通过对 NetFilx的 NetFlix OSS 套件中的组件通过整合完成的,其中,比较重要的整合组件有:
(1)spring-cloud-netflix-Eureka 注册中心
(2)spring-cloud-netflix-hystrix RPC保护组件
(3)spring-cloud-netflix-ribbon 客户端负载均衡组件
(4)spring-cloud-netflix-zuul 内部网关组件
(6)spring-cloud-config 配置中心
SpringCloud 全家桶技术栈除了对 NetFlix OSS的开源组件做整合之外,还有整合了一些选型中立的开源组件。比如,SpringCloud Zookeeper 组件整合了 Zookeeper,提供了另一种方式的服务发现和配置管理。
SpringCloud 架构中的单体业务服务是基于 SpringBoot 应用进行启动和执行的。SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。SpringCloud 利用 SpringBoot 是什么关系呢?
(1)首先 SpringCloud 利用 SpringBoot 开发便利性巧妙地简化了分布式系统基础设施的开发;
(2)其次 SpringBoot 专注于快速方便地开发单体微服务提供者,而 SpringCloud 解决的是各微服务提供者之间的协调治理关系;
(3)第三 SpringBoot 可以离开 SpringCloud 独立使用开发项目,但是 SpringCloud 离不开SpringBoot,其依赖 SpringBoot 而存在。
最终,SpringCloud 将 SpringBoot 开发的一个个单体微服务整合并管理起来,为各单体微服务提供配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等基础的分布式协助能力。
SpringCloud 开发脚手架
无论是单体应用还是分布式应用,如果从零开始开发,都会涉及很多基础性的、重复性的工作需要做,比如用户认证,比如 session 管理等等。有了开发脚手架,这块基础工作就可以省去,直接利用脚手架提供的基础模块,然后按照脚手架的规范进行业务模块的开发即可。
笔者看了开源平台的不少开源的脚手架,发现很少是可以直接拿来做业务模块开发的,或者封装的过于重量级而不好解耦,或者业务模块分包不清晰而不方便开发,所以,本着简洁和清晰的原则,笔者的发起的疯狂创客圈社群推出了自己的微服务开发脚手架 crazy-springcloud,其大致的模块和功能具体如下:
crazymaker-server -- 根项目
│ ├─cloud-center -- 微服务的基础设施中心
│ │ ├─cloud-eureka -- 注册中心
│ │ ├─cloud-config -- 配置中心
│ │ ├─cloud-zuul -- 网关服务
│ │ ├─cloud-zipkin -- 监控中心
│ ├─crazymaker-base -- 公共基础依赖模块
│ │ ├─base-common -- 普通的公共依赖,如 utils 类的公共方法
│ │ ├─base-redis -- 公共的 redis 操作模块
│ │ ├─base-zookeeper -- 公共的 zookeeper 操作模块
│ │ ├─base-session -- 分布式 session 模块
│ │ ├─base-auth -- 基于 JWT + SpringSecurity 的用户凭证与认证模块
│ │ ├─base-runtime -- 各 provider 的运行时公共依赖,装配的一些通用 Spring IOC Bean 实例
│ ├─crazymaker-uaa --业务模块: 用户认证与授权
│ │ ├─uaa-api -- 用户 DTO、Constants 等
│ │ ├─uaa-client -- 用户服务的 Feign 远程客户端
│ │ ├─uaa-provider -- 用户认证与权限的实现,包含controller 层、service层、dao层的代码实现
│ ├─crazymaker-seckill --业务模块: 秒杀练习
│ │ ├─seckill-api -- 秒杀 DTO、Constants 等
│ │ ├─seckill-client -- 秒杀服务的 Feign 远程调用模块
│ │ ├─seckill-provider -- 秒杀服务核心实现,包含controller层、service层、dao层的代码实现
│ ├─crazymaker-demo --业务模块: 练习演示
│ │ ├─demo-api -- 演示模块的 DTO、Constants 等
│ │ ├─demo-client -- 演示模块的 Feign 远程调用模块
│ │ ├─demo-provider -- 演示模块的核心实现,包含controller层、service层、dao层的代码实现
在业务模块如何分包的问题上,实际上大部分企业都有自己的统一规范。crazy-springcloud 脚手架从职责清晰、方便维护、能快速导航代码的角度出发,将每一个业务模块,细分成以下三个子模块:
(1) {module}-api
此子模块定义了一些公共的 Constants 业务常量和 DTO 传输对象,该子模块既被业务模块内部依赖,也可能被依赖该业务模块的外部模块所依赖;
(2) {module}-client
此子模块定义了一些被外部模块所依赖的 Feign 远程调用客户类,该子模块是专供外部的模块,不能被内部的其他子模块所依赖;
(3) {module}-provider
此子模块是整个业务模块的核心,也是一个能够独立启动、运行的服务提供者(Application),该模块包含涉及到业务逻辑的 controller 层、service 层、dao 层的完整代码实现。
crazy-springcloud 微服务开发脚手架在以下两方面进行了弱化:
(1)在部署方面对容器的介绍进行了弱化,没有使用 Docker 容器而是使用 Shell 脚本。有多方面的原因:一是本脚手架初心是学习,使用 Shell 脚本而不是 Docker 去部署,方便大家学习 Shell 命令和脚本;二是 Java 和 Docker 其实整合得很好,学习非常容易,可以稍加配置就能做到一键发布,找点资料就可以掌握; 三是部署和运维是一个专门的工作,生产环境的部署、甚至是整个自动化构建和部署的工作,实际上属于运维的专项工作,由专门的运维岗位人员去完成,而部署的核心仍然是 Shell 脚本,所以对于开发人员来说掌握 Shell 脚本才是重中之重。
(2)对监控软件的介绍进行了弱化。本书没有对链路监控、JVM性能指标、断路器监控软件的使用做专门介绍。有多方面的原因:一是监控的软件太多,如果介绍太全,篇幅又不够,介绍太少,大家又不一定用到; 二是监控软件的使用大多是一些软件的操作步骤和说明,原理性的内容比较少,使用视频的形式会比文字形式知识传递的效果会更好。疯狂创客圈后续可能(但不一定)会推出一些微服务监控方面的教学视频供大家参考,请大家关注社群博客。不论如何,只要掌握了 SpringCloud 核心原理,对那些监控组件使用的掌握,对大家来说基本上都是一碟小菜。
启动Eureka Server 注册中心
Eureka 本身是 Netflix 开源的一款注册中心产品,并且 SpringCloud 提供了相应的集成封装,选择其作为注册中心的讲解实例,是出于以下的原因:
(1)Eureka 在业界的应用十分广泛(尤其是国外),整个框架也经受住了 Netflix 严酷生产环境的考验。
(2)除了 Eureka 注册中心,Netflix 的其他服务治理功能也十分强大,包括 Ribbon、Hystrix、Feign、Zuul 等组件,结合到一起组成了一套完整的服务治理框架,使得服务的调用、路由也变得异常容易。
那么,Netflix 和 SpringCloud 是什么关系呢?
Netflix 是一家互联网流媒体播放商,是美国视频巨头,访问量非常的大。也正是如此,Netflix 把整体的系统迁移到了微服务架构。并且,Netflix 就把它的几乎整个微服务治理生态中的组件,都开源贡献给了 Java 社区,叫做 Netflix OSS。
SpringCloud 是 Spring 背后的 Pivotal 公司(由 EMC 和 VMware 联合成立的公司)在 2015 年推出的开源产品,主要对 Netflix 开源组件的进一步封装,方便 Spring 开发人员构建微服务架构的应用。
SpringCloud Eureka 是 SpringCloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务实例的自动化注册与发现,这也是微服务架构中最为核心和基础的功能。
Eureka 所治理的每一个微服务实例,被称之为 Provider Instance (提供者实例)。每一个 Provider Instance 微服务实例包含一个 Eureka Client 客户端组件(相当于注册中心客户端组件),其主要的工作为:
(1)向 Eureka Server 完成 Provider Instance 的注册、续约和下线等操作,主要的注册信息包括服务名、机器 IP、端口号、域名等等。
(2)向 Eureka Server 获取 Provider Instance 清单,并且缓存在本地。
一般来说,Eureka Server 作为服务治理应用,会独立地部署和运行。一个 Eureka Server 注册中心应用在新建的时候,首先需要在pom.xml文件中添加上 eureka-server 依赖库。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后,需要在启动类中添加注解 @EnableEurekaServer,声明这个应用是一个Eureka Server,启动类的代码如下:
package com.crazymaker.springcloud.cloud.center.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//在启动类中添加注解 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
然后,在应用配置文件 application.yml 中,对 Eureka Server 的一些参数进行配置。一份基础的配置文件大致如下:
server:
port: 7777
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
#服务注册中心的配置内容,指定服务注册中心的位置
defaultZone: ${SCAFFOLD_EUREKA_ZONE_HOSTS:http://localhost:7777/eureka/}
instance:
hostname: ${EUREKA_ZONE_HOST:localhost}
server:
enable-self-preservation: true # 开启自我保护
eviction-interval-timer-in-ms: 60000 # 扫描失效服务的间隔时间(单位毫秒,默认是60*1000)即60秒
以上的配置文件中,包含了三类配置项:作为服务注册中心的配置项(eureka.server.)、作为 Provider 提供者的配置项(eureka.instance.)、作为注册中心客户端组件的配置项(eureka.client.*),至于具体的原因,请参考《SpringCloud Nginx高并发核心编程》一书。
配置完成后,通过运行启动类 EurekaServerApplication 就可以启动 Eureka Server,然后通过浏览器访问 Eureka Server 的控制台界面(其端口为 server.port 配置项的值),大致如下图所示。
图:Eureka Server 的控制台界面
启动Config 配置中心
在采用分布式微服务架构的系统中,由于服务数量巨多,为了方便服务配置文件统一管理,所以需要分布式配置中心组件。如果各个服务的配置分散管理,则,上线之后配置的如何保持一致,将会是一个很头疼的问题。
所以,各个服务的配置定然需要集中管理。SpringCloud Config 配置中心是一个比较好的解决方案。使用SpringCloud Config配置中心,涉及到两个部分:
(1)config-server 服务端配置;(需要独立运行)
(2)config-client 客户端配置。 (作为组件嵌入到Provider微服务提供者)
config-server 服务
通过SpringCloud 构建一个 config-server 服务,大致需要三步。首先,在pom.xml中引入spring-cloud-config-server 依赖,大致如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
其次,在所创建的 SpringBoot的程序主类上,添加@EnableConfigServer注解,开启Config Server 服务,代码如下:
@EnableConfigServer
@SpringBootApplication
public
class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
第三步,设置属性文件的位置。SpringCloud Config 提供本地存储配置的方式。在bootstrap启动属性文件中,设置属性 spring.profiles.active=native,并且设置属性文件所在的位置,大致如下:
server:
port: 7788 #配置中心端口
spring:
application:
name: config-server # 服务名称
profiles:
active: native # 设置读取本地配置文件
cloud:
config:
server:
native:
searchLocations: classpath:config/ #申明本地配置文件的存放位置
配置说明:
(1)spring.profiles.active=native,表示读取本地配置,而不是从git读取配置。
(2)search-locations=classpath:config/ 表示查找文件的路径,在类路径的config下。
服务端的配置规则:在配置路径下,以 {label}/{application}-{profile}.properties 的命令规范,放置对应的配置文件。上面实例,放置了以下配置文件:
分别对通用配置common、数据库配置db、缓存配置的相关属性,进行设置。Config 配置中心启动之后,使用 http:// ${CONFIG-HOST}: ${CONFIG-PORT}/{application}/{profile}[/{label}] 的地址格式,可以直接访问所加载好的配置属性。
例如,访问示例中的 http://192.168.233.128:7788/crazymaker/redis/dev 地址,返回的配置信息如下图所示。
特别说明:SpringCloud config-server 支持有多种配置方式,比如 Git,native,SVN 等。虽然官方建议使用Git方式进行配置,这里没有重点介绍 Git方式,而是使用了本地文件的方式。有三个原因:
(1) 对于学习或者一般的开发来说,本地的文件的配置方式更简化;
(2) 生产环境建议使用 Nacos,集成注册中心和配置中心,更加方便和简单;
微服务入门案例
在本书的配套源码 crazy-springcloud 脚手架中,设计三个 Provider 服务提供者:uaa-provider (用户账号与认证)、demo-provider (演示用途)、seckill-provider (秒杀服务),具体如下图所示。
图:本书的配套源码中的服务提供者
uaa-provider 微服务提供者
首先,一个 Provider 服务提供者至少需要以下两个组件包依赖:SpringBoot WEB 服务组件、Eureka Client 客户端组件,大致如下:
<dependencies>
<!--SpringBoot WEB 服务组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka Client 客户端组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
SpringBoot WEB 服务组件用于提供 REST 接口服务,Eureka Client 客户端组件用于服务注册与发现。从以上的 Maven 依赖可以看出,在 SpringCloud 技术体系中,一个 Provider 服务提供者首先是一个 SpringBoot 应用,所以,在学习 SpringCloud 微服务技术之前,必须具备一些基本的 SpringBoot 开发知识。
然后,在 SpringBoot 应用的启动类上加上 @EnableDiscoveryClient 注解,用于启用 Eureka Client 客户端组件,启动类的代码如下:
package com.crazymaker.springcloud.user.info.start;
//...省略import
@SpringBootApplication
/*
* 启用 Eureka Client 客户端组件
*/
@EnableEurekaClient
public class UAACloudApplication
{
public static void main(String[] args)
{
SpringApplication.run(UAACloudApplication.class, args);
}
}
接下来,在 Provider 模块(或者项目)的 src/main/resources 的 bootstrap 启动属性文件中(bootstrap.properties或bootstrap.yml),增加 Provider 实例相关的配置,具体如下:
spring:
application:
name: uaa-provider
server:
port: 7702
servlet:
context-path: /uaa-provider
eureka:
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
ip-address: ${spring.cloud.client.ip-address}
prefer-ip-address: true #访问路径优先使用 IP地址
status-page-url-path: /${server.servlet.context-path}${management.endpoints.web.base-path}/info
health-check-url-path: /${server.servlet.context-path}${management.endpoints.web.base-path}/health
client:
egister-with-eureka: true #注册到eureka服务器
fetch-registry: true #是否去注册中心获取其他服务
serviceUrl:
defaultZone: http://${EUREKA_ZONE_HOST:localhost}:7777/eureka/
在详细介绍上面的配置项之前,先启动一下 Provider 的启动类, 控制台的日志大致如下:
...com.netflix.discovery.DiscoveryClient - DiscoveryClient_UAA-PROVIDER/192.168.233.128:7702: registering service...
....
...com.netflix.discovery.DiscoveryClient - DiscoveryClient_UAA-PROVIDER/192.168. 233.128:7702 - registration status: 204
如果看到上面的日志,表明 Provider 实例已经启动成功。可以进一步通过 Eureka Server 检查服务是否注册成功:打开 Eureka Server 的控制台界面,可以看到 uua-provider 的一个实例已经成功注册,具体如下图所示。
图:uua-provider 实例已经在成功注册到 Eureka Server
前面讲到,SpringCloud 中一个 Provider 实例身兼两者角色:Provider 服务提供者、注册中心客户端。所以,在 Provider 的配置文件中,包含了两类配置: Provider 实例角色的相关配置、Eureka Client 客户端角色的相关配置。
有关的Provider 实例角色的相关配置,请参考《SpringCloud Nginx高并发核心编程》一书。
uaa-provider 实现一个Rest接口
以 uaa-Provider的 获取用户信息接口为例,进行介绍,
这里实现一个获取用户信息的接口 /api/user/detail/v1 ,该接口的具体的代码,在uaa-Provider模块中,如下图所示:
具体的代码如下:
package com.crazymaker.springcloud.user.info.controller;
import com.alibaba.fastjson.JSONObject;
import com.crazymaker.springcloud.common.dto.UserDTO;
import com.crazymaker.springcloud.common.result.RestOut;
import com.crazymaker.springcloud.user.info.service.impl.FrontUserEndSessionServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Api(value = "用户信息、基础学习DEMO", tags = {"用户信息、基础学习DEMO"})
@RestController
@RequestMapping("/api/user" )
public class UserController
{
@Resource
private FrontUserEndSessionServiceImpl userService;
/**
* 注入全局的加密器
*/
@Resource
PasswordEncoder passwordEncoder;
@GetMapping("/detail/v1" )
@ApiOperation(value = "获取用户信息" )
public RestOut<UserDTO> getUser(@RequestParam(value = "userId", required = true) Long userId)
{
UserDTO dto = userService.getUser(userId);
if (null == dto)
{
return RestOut.error("没有找到用户" );
}
return RestOut.success(dto).setRespMsg("操作成功" );
}
@GetMapping("/passwordEncoder/v1" )
@ApiOperation(value = "密码加密" )
public RestOut<String> passwordEncoder(
@RequestParam(value = "raw", required = true) String raw)
{
// passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
String encode = passwordEncoder.encode(raw);
return RestOut.success(encode);
}
}
uaa-provider的运行结果
获取用户信息:
demo-provider 完成RPC远程调用
demo-provider 使用 Feign+Ribbon 进行 RPC 远程调用时,对每一个Java 远程调用接口,Feign 都会生成了一个 RPC远程调用客户端实现类,只是,该实现类对于开发者来说是透明的,开发者感觉不到这个类的存在。
需要在 Maven 的pom文件中,增加以下Feign+Ribbon 集成模块的依赖:
<!--导入 SpringCloud Ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--添加Feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
客户端 RPC 实现类位于远程调用 Java 接口和服务提供者 Provider 之间,承担了以下职责:
(1)拼装 REST 请求:根据 Java 接口的参数,拼装目标 REST 接口的 URL;
(2)发送请求和获取结果:通过 Java HTTP 组件(如 HttpClient)调用服务提供者 Provider 的 REST 接口,并且获取 REST 响应;
(3)结果解码:解析 REST 接口的响应结果,封装成目标 POJO 对象(Java 接口的返回类型),并且返回。
REST服务的本地代理接口
该接口的具体的代码,在uaa-client模块中,如下图所示:
具体的代码如下:
package com.crazymaker.springcloud.user.info.remote.client;
import com.crazymaker.springcloud.common.dto.UserDTO;
import com.crazymaker.springcloud.common.result.RestOut;
import com.crazymaker.springcloud.standard.config.FeignConfiguration;
import com.crazymaker.springcloud.user.info.remote.fallback.UserClientFallback;
import com.crazymaker.springcloud.user.info.remote.fallback.UserClientFallbackFactory;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
* Feign 客户端接口
* @description: 用户信息 远程调用接口
* @date 2019年7月22日
*/
@FeignClient(value = "uaa-provider",
configuration = FeignConfiguration.class,
fallback = UserClientFallback.class,
// fallbackFactory = UserClientFallbackFactory.class,
path = "/uaa-provider/api/user")
public interface UserClient
{
/**
* 远程调用 RPC 方法:获取用户详细信息
* @param userId 用户 Id
* @return 用户详细信息
*/
@RequestMapping(value = "/detail/v1", method = RequestMethod.GET)
RestOut<UserDTO> detail(@RequestParam(value = "userId") Long userId);
}
通过REST服务的本地代理接口,进行RPC调用
进行RPC调用的具体的代码,在demo-provider模块中,如下图所示:
package com.crazymaker.springcloud.demo.controller;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.crazymaker.springcloud.common.dto.UserDTO;
import com.crazymaker.springcloud.common.result.RestOut;
import com.crazymaker.springcloud.common.util.JsonUtil;
import com.crazymaker.springcloud.user.info.remote.client.UserClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/call/uaa/")
@Api(tags = "演示 uaa-provider 远程调用")
public class UaaRemoteCallController
{
//注入 @FeignClient注解配置 所配置的 客户端实例
@Resource
UserClient userClient;
@GetMapping("/user/detail/v2")
@ApiOperation(value = "Feign 远程调用")
public RestOut<JSONObject> remoteCallV2(
@RequestParam(value = "userId") Long userId)
{
RestOut<UserDTO> result = userClient.detail(userId);
JSONObject data = new JSONObject();
data.put("uaa-data", result);
return RestOut.success(data).setRespMsg("操作成功");
}
}
demo-provider需要依赖 uaa-client模块
启动demo-provider
访问swagger ui:
通过swagger 执行RPC操作
ok,是不是很简单
源码请参见 《SpringCloud Nginx 高并发核心编程》一书源码
虽然SpringCloud 入门很简单,但是原理很复杂, 而且掌握SpringCloud 原理,是成为核心工厂师的必备知识
环境准备:
基于 crazy-springcloud 脚手架(其他的脚手架也类似)的微服务开发和自验证过程中,涉及到的基础中间件大致如下:
(1)ZooKeeper
ZooKeeper 是一个分布式的、开放源码的分布式协调应用程序,是大数据框架 Hadoop 和 Hbase的重要组件。在分布式应用中,它能够高可用地提供很多保障数据一致性的基础能力:分布式锁、选主、分布式命名服务等。
在 crazy-springcloud 脚手架中,高性能分布式 ID 生成器用到了 ZooKeeper。有关其原理和使用,请参见《Netty Zookeeper Redis 高并发实战》一书。
(2)Redis
Redis 是一个高性能的缓存数据库。在高并发的场景下,Redis 可以对关系数据库起到很好的缓冲作用;在提高系统的并发能力和响应速度方面,Redis 举足轻重和至关重要。crazy-springcloud 脚手架的分布式 Session 用到了 Redis。 有关 Redis 的原理和使用,还是请参见《Netty Zookeeper Redis 高并发实战》一书。
(3)Eureka
Eureka 是 Netflix 开发的服务注册和发现框架,本身是一个 REST 服务提供者,主要用于定位运行在 AWS(Amazon 云)的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务注册和发现功能。
(4)SpringCloud Config
SpringCloud Config 是 SpringCloud 全家桶中最早的配置中心,虽然在生产场景中,很多的企业已经使用 Nacos 或者 Consul 整合型的配置中心替代了独立的配置中心,但是 Config 依然适用于 SpringCloud 项目,通过简单的配置即可使用。
(5) Zuul
Zuul 是 Netflix 开源网关,可以和 Eureka、Ribbon、Hystrix 等组件配合使用,SpringCloud 对Zuul 进行了整合与增强,使用其作为微服务集群的内部网关,负责对给集群内部各个 provider 服务提供者进行 RPC 路由和请求过滤。
以上中间件的端口配置,以及部分安装和使用视频,大致如下表所示。
中间件 | 链接地址 |
---|---|
Linux Redis 安装(带视频) | Linux Redis 安装(带视频) |
Linux Zookeeper 安装(带视频) | Linux Zookeeper 安装, 带视频 |
....完整的开发环境的准备工作,-> | 请去疯狂创客圈 博客园 总入口 |
。。。。 |