学servlet时,spring框架帮我们简化了代码;
但是spring框架的配置太多了,springboot帮我们简化了配置;
springboot 新一代的java开发标准,自动装配;
微服务4个核心问题:
1、服务很多,客户端怎么访问?
2、这么多服务,服务之间怎么访问?
3、这么多服务,怎么治理?
4、服务挂了怎么办?
解决方案:
springcloud 生态;
1、springcloud NetFlix
api网关:zuul组件;
Feign----Httpclient—Http通信方式、同步、阻塞
服务注册与发现:Eureka;
熔断机制:Hystrix;
2、Dubbo+zookeeper 半自动,需要整合别人的
api网关:没有,找第三方组件,或者自己实现;
Dubbo
zookeeper
熔断机制:没有,找第三方组件:Hystrix
3、springcloud Alibaba
万变不离其宗
路由问题:Api网关;
通信问题:http、rpc;
高可用问题:服务的注册与发现:
服务降级问题:熔断机制;
微服务技术栈:
springcloud官网:https://spring.io/projects/spring-cloud
参考书:
https://www.springcloud.cc/spring-cloud-netflix.html
中文文档:https://www.springcloud.cc/spring-cloud-dalston.html
中文社区:
中文网:https://www.springcloud.cc
springcloud和springboot的版本对应关系:
Eureka
搭建项目四个步骤:
1、导入依赖
2、编写配置文件
3、开启功能 @Enablexxxxx
4、配置类
集群环境配置中:
表示将多个域名映射到一个服务器上:
Eureka总结:
1、三个注解:
@EnableEurekaServer // 注册中心
@EnableEurekaClient // 服务启动后自动注册到eureka中
@EnableDiscoveryClient // 开启服务发现客户端的注解,可以用来获取一些配置的信息,得到具体的微服务
2、application中的配置信息
3、集群环境配置
配置三个Eureka注册中心的application.yml,保证三个集群互相关联;
配置服务提供者的application.yml,保证服务提供者被注册到三个集群中;
Ribbon
下图中虚线表示将服务提供者注册到eureka中;
实线表示Ribbon所起的作用;
总结:
1、两个注解:
@LoadBalanced,配置在configBean中
//配置负载均衡实现RestTemplate
// IRule
// RoundRobinRule 轮询
// RandomRule 随机
// AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务,对剩下的进行轮询
// RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
@RibbonClient(name = “SPRINGCLOUD-PROVIDER-DEPT”,configuration = MyRule.class)//开启负载均衡,并指定自定义的规则,放在启动类上
//在微服务启动的时候就能加载自定义的Ribbon类(自定义的规则会覆盖原有默认的规则)
Feign总结:
1、两个注解:
// @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务,这个注解写在service上;
@FeignClient(value = “SPRINGCLOUD-PROVIDER-DEPT”)
//这个注解写在controller上,用来调用service
@EnableFeignClients(basePackages = {“com.kuang.springcloud”})
Hystrix总结:
1、熔断机制–注解
@HystrixCommand(fallbackMethod = “hystrixGet”)
// 写在controller上,当本方法调用失败/抛出异常时,调用hystrixGet方法;
@EnableCircuitBreaker //添加对熔断支持的注解
写在启动类上
2、降级机制–注解
// @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
//fallbackFactory指定降级配置类@Component
@FeignClient(value = “SPRINGCLOUD-PROVIDER-DEPT”,fallbackFactory = DeptClientServiceFallBackFactory.class)
配置
# 开启降级feign.hystrix
feign:
hystrix:
enabled: true
切记:服务熔断写在服务端;服务降级写在客户端。
3、dashboard注解
先配置dashboard的module,只需要导入依赖、配置端口号、在启动类上加注解;
@EnableHystrixDashboard
在服务提供者端添加流监控(加servlet),并加注解@EnableCircuitBreaker //添加对熔断支持的注解
4、dashboard图像含义:
Zuul总结:
导入依赖、配置文件(注册到eureka中的配置、写zuul的路由网关配置)、启动类(在启动类上加@EnableZuulProxy // 开启Zuul)
zuul:
# 路由相关配置
# 原来访问路由 eg:http://www.cspStudy.com:9527/springcloud-provider-dept/dept/get/1
# zull路由配置后访问路由 eg:http://www.cspstudy.com:9527/haust/mydept/dept/get/1
routes:
mydept.serviceId: springcloud-provider-dept # eureka注册中心的服务提供方路由名称
mydept.path: /mydept/** # 将eureka注册中心的服务提供方路由名称 改为自定义路由名称
# 过滤相关配置
# 不能再使用这个路径访问了,*: 忽略,隐藏全部的服务名称(包括之前的springcloud-provider-dept)~
ignored-services: "*" #真实情况下会有很多微服务需要经过网关的
# 设置公共的前缀
prefix: /haust
config总结:
1、注解
@EnableConfigServer // 开启spring cloud config server服务
加在server的启动类上;
注解只有一个,大头在配置文件上:
config-server中的application.yml:
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 连接码云远程仓库
cloud:
config:
server:
git:
# 注意是https的而不是ssh
uri: https://gitee.com/shihao_liu/springcloud_config.git
# 通过 config-server可以连接到git,访问其中的资源以及配置~
# 不加这个配置会报Cannot execute request on any known server 这个错:连接Eureka服务端地址不对
# 或者直接注释掉eureka依赖 这里暂时用不到eureka
eureka:
client:
register-with-eureka: false
fetch-registry: false
config-client中的bootstrap.yml:
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的资源文件的名称,不要后缀
profile: test # 访问远端仓库config-client文件中的dev
label: master # 访问远端仓库的master分支
uri: http://localhost:3344 # 访问本地的springcloud-config-sever-3355服务
config-client中的application.yml:
# 用户级别的配置
spring:
application:
name: springcloud-config-client
2、可以将所有的配置项都配置在github上,代码都写在client中,通过config-server去连接github,运维人员只需要在github上改配置就好,这样就实现了代码与配置解耦;
案例:
远端写config-dept.yml和config-eureka.yml配置文件;
新建eureka服务端(同时也是config客户端),其eureka配置从远端的config-eureka.yml中读取;
新建服务提供者(同时也是config客户端),其配置文件从远端的config-dept.yml中读取;并加@EnableEurekaClient注解 ,在其启动后就注册到eureka中;
启动config服务端;启动eureka服务端;启动服务提供者(可在eureka注册中心中显示);