码云地址:https://gitee.com/527184687/cloudproject
重修版地址:https://gitee.com/527184687/cloud-test
1.开发环境window,工具idea 2018
2.准备 plugins 安装spring boot 插件 2018版在线插件老是链接超时,没法只能本地安装插件了。
去https://plugins.jetbrains.com/ 查询插件下载下来,然后本地安装。
安装成功后New Module 中会出现
spring Cloud 组件有很多,并且还在持续更新和增加中
在这里我们只做基础练手的SpringCloud
0.简介
1.服务注册和服务发现。
zookeeper、consul、Eureka等,Netflix 公司在 github 上公告 Eureka 2.0 开源工作停止,继续使用风险自负。但是Eureka还是比较稳定和简单的,这里我们用Eureka做服务发现注册
2.客户端负载均衡组件
ribbon
3.Feign 声明式REST客户端
微服务之间的调用本质还是http请求,只要是http请求的都可以使用feign,帮助我解决代码的重复编写,fegin整合了ribbon,默认会使用ribbon的负载策略。
feign最重要的作用是整合业务中多个http请求为一个resfult 接口。如:用户服务,文章服务。一般两个服务我们会先查询用户接口,然后通过用户的信息查询用户的文章,这得查询两个接口,并且还有逻辑顺序在里面。而feign就是解决接口调用逻辑,防止因调用逻辑错误导致崩溃问题。
4.网关组件
zuul提供动态路由,监控,弹性,安全等边缘服务的框架。可以做filter、session等。
还有hystrix断路器、spring cloud config远程配置服务等,spring Cloud 还有其他组件后续再研究
好了,准备完了咱们开始。
1.新建一个maven project
新建一个空白的maven project
一直到finish
这个maven 是一个工程包,打包用。
2.服务的注册与发现
创建子module
中间是服务发现的组件我们用的eureka,选中那个spring initializr会自动帮我们在pom添加上maven路径
这是spring initializr生成的module
这里需要在cloudtest(父类project)pom.xml手动添加,否则从新导入maven项目时,ide无法显示模块关系
<!-- 引入SpringCloud微服务常用组件-->
<modules>
<module>eureka</module>
</modules>
Sping Cloud基于SpringBoot,而SpringBoot这个框架使用的是application.properties或者是application.yml,properties优先级高于yml。两者区别是一个是.分隔,一个是:分隔看个人习惯。这里我两个都写了。
eureka详细配置说明这里 Spring Cloud Eureka 常用配置及说明
最后在spring boot启动类上加上注解
@EnableEurekaServer //eureka服务注册中心
到这里eureka的服务发现与注册完成了,咱们来试一下
访问localhost:8801
咱们的eureka成功了。
3.创建服务
这里有个概念:服务提供者和服务消费者
服务提供者:服务的被调用方,即为其他服务提供服务的服务。
服务消费者:服务的调用方,即依赖其他服务的服务。
这个概念网上都是这么说的,但是两者代码没有什么区别。网上查询资料和思考,这里它们还真的只是概念。它没有调用其他服务,只提供服务它就是提供者;它调了其他服务,它就是消费者,它要是两者都是也行。这里真的很烦人,好多文章语文能力不够的还不一定能读懂呢o(* ̄▽ ̄*)o
前几步跟上面一样
这里不一样,不一样,不一样!选择了Eureka 服务注册,要是不选它会怎样呢?结果是不选它,你上面的Eureka是不能发现你这个user-service服务的。还有Ribbon负载均衡器,这个不选它会怎么样呢?实例中没什么影响,但是如果你要启用多个user-service那你就需要它了。
finish 完成
再次感觉spring initializr真方便。( •̀ ω •́ )✧
先写配置文件
server.port=8802
spring.application.name=user-service
服务端口8802 服务名称是user-service。要是负载的话spring.application.name=user-service可以是一个,端口可以开多个。
spring boot启动类添加注释@EnableDiscoveryClient或者@EnableEurekaClient 两个都是注册。
注册中心是eureka使用@EnableEurekaClient这个只为Eureka服务,其他的注册中心使用
@EnableDiscoveryClient,包括Eureka。所以这里咱们使用@EnableDiscoveryClient
先创建service,输出"user-service:张三";要结合mybatis的话,跟springboot和springMVC类似。
然后创建Controller
咱们用的是@RestController,这里有@Controller和@RestController的区别呢,区别就是@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
spring boot @RequestMapping @GetMapping @PostMapping 这几个区别是,@GetMapping和@PostMapping 是@RequestMapping +method = RequestMethod.GET的缩写
这里有个坑点 要返回JSON数据的话需要头部加上
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
相当于response设置Content-Type=application/json;charset=UTF-8
如果不设置,返回默认是xml格式。这里可以通过实现WebMvcConfigurer中configureContentNegotiation来统一配置。
//使用两个注解
@Configuration
@EnableWebMvc
这样就省去每个接口都要produces了,并且parameterName("mediaType")根据mediaType参数返回xml或者json两种格式。还可以通过后缀来实现如 getuser.json或者getuser.xml
每个服务很少会只启动一个,一般都会做负载。
下面咱们给这个user-service 做个负载
在spring boot启动类上添加bean。@LoadBalanced 注解就是启用负载,其他策略配置请看
Ribbon负载均衡策略配置 - Lovnx - CSDN博客
user-service启动多个8802、8803、8804
这里只需要增加三个配置文件就和一个主配置文件
配置文件命名规则必须是:
application-{profile}.properties/application-{profile}.properties
咱们把之前的配置文件改一下。
先复制3个application.properties改名
springboot中spring.profiles.active来具体激活一个或者多个配置文件的。
所以application.properties中只需要写
spring.profiles.active=8802
启动其他几个服务只需要修改spring.profiles.active等于的值就行了。
这里yml格式配置清晰明了好书写。建议使用yml
打包后使用 java -jar xxx.jar --spring.profiles.active=8804 来启用不同的配置文件
yml 格式支持两种模式一种和.properties一样多个文件-分隔,另一种是写在一个文件中
https://blog.csdn.net/swordsnapliu/article/details/78540902
命令行启动:
启动多个可以自己实验一下。
idea要启动三个相同服务需要configureactions中复制三个,否则直接右键run会弹出stop and return 只能启动一个。
Override parameters 启动的附加参数:这样可以通过ide 启动多个。
好咱们启动。咱们看一下效果
分别访问一下
8802,8803,8804
完美!ヾ(≧▽≦*)o
4.声明式REST客户端
负载什么时候用呢?这里zuul时用、feign RPC时用、只要远程服务调用就会启动负载。咱们都试试。
RPC与REST区别:RPC是框架,REST是框架风格。
feign的RPC
重复上面的动作
这里选择的时feign
先来配置文件咱们用9000端口
spring boot 启动类添加注解
@EnableDiscoveryClient或者@EnableEurekaClient
@EnableFeignClients //RPC扫描
创建RPC:
添加注解
@FeignClient("user-service") //告诉RPC访问那个服务
@RequestMapping(value = "/getuser?name=RPC-9000") //调用服务那个接口
为了大家能感知到我给接口传参name=RPC-9000
创建Controller,要使用restTemplate 需要在启动类里添加RestTemplate的实现
并且改造一下user-service的Controller,增加了参数name,谁调用的。
启动测试,第一次端口8004,getuserRPC
F5刷新一下,变成了8803,再刷新输出结果端口变化。
说明,负载是起作用的。完美!( ̄▽ ̄)"
另一种调用方式通过RestTemplate 进行服务间调用
先在启动类中增加RestTemplate,你也可以直接new 对象。上面有提到。
然后增加一个接口 /getuserREST。我不太喜欢这种风格。代码中固化的变量和暴露的东西有点多,不喜欢这种风格。
可以看一下【架构师】微服务架构--REST与RPC - 老莫的博客 - CSDN博客
看一下区别
5.zuul网关
先来说一下网关的必要性请看【微服务】Zuul的必要性 - 海棠不惜胭脂色,独立蒙蒙细雨中 - CSDN博客
个人认为网关最重要的作用是
安全验证
过滤保护
流量管理和控制
说白话就是你家小区看大门的大爷,谁能进、谁不能进(安全验证);送外卖的能进,送快递的不能进(过滤保护);开一次闸杆只能进一辆车,小车来了闸杆开5s,大车来了开15s(流量管理和控制);
要是没有这个这个网关呢,在流量小的时候不会有事,只要流量上来了。分分钟把你小区堵死瘫痪掉。
创建方式与之前一样,不一样的是这里勾选zuul,到这大家发现这个new Module只是控制了pom,要是忘了勾选了,自己修改在pom中添加组件所需的jar包一样的。没什么神奇的,程序员就是要懒。
先修改配置文件这里注意一下,zuul 两种写法我喜欢第一种直观。
zuul.routes.user-service=/api-a/**
这是把user-service服务编程/api-a/getuser
zuul.routes.user-service=/api-a/**
#等同于一下写法
#zuul.routes.provider.path=/api-a/**
#zuul.routes.provider.serviceId=user-service
#yml写法
zuul:
routes:
user-service: /api-a/**
spring boot 启动类注解
@EnableZuulProxy
@EnableDiscoveryClient
基础的zuul已经算完事了,其他的过滤啊,session啊,熔断啊,流量控制啊。在这就不写了,不然太多了。
启动测试一下,第一次是8802
刷新一下,编程了8803
到这咱们的SpringCloud 练手实例基本完事!o(* ̄▽ ̄*)o
红色文字描述,是Eureka心跳检测警告。
这里我尝试使用原JSP项目升级,网上找了一些cloud jsp 不能使用。自己尝试后找到一些坑点
第一步:
配置文件和目录结构:
自己创建缺失文件夹
--webapp
--WEB-INF
--index.html
pom.xml 增加jstl 解析模板
properties 只定义了编码相关,网上有的把视图配置也放进去,我尝试了。不起作用。后来我找到使用一下注解也可以控制配置
@Configuration
@EnableWebMvc
配置:
创建html和controller:
我这里也想做个负载试试行不行
跟UserServer一样操作过程
但是,要是使用idea 的Run/Debug Configurations 需要几个地方注意一下。
测试:
尝试一下负载:
修改feign
重启测试一下:
o( ̄▽ ̄)d居然可行啊,这样一个简单的前端负载就可以了。不用搞nginx 那一套。微型负载可以满足小用户量需要求了。
赞!!!!!!!!!!!!!!!!
通过分析研究Spring Cloud神秘面纱已经揭开了一点。管中窥豹,可见一斑。这个Spring Cloud自由度很高,耦合很低的框架。基本上每一个功能使用插件都可以进行替换 如:我不用zuul用gatway等等;每一个功能都可以互相替换并且还可以做分布式,如:feign与zuul互换,feign也可以在做负载,等等。
网上关于Spring Cloud 相关理论很多自己去看看。理解了思想才重要。
下一次我写一下spring Cloud 连接数据库使用阿里的druid连接池和filter 过滤器和session共享
网友评论