SpringCloud学习笔记
网站架构模式
首先来记录下基本的网络架构模式
- 单点应用
- 分布式系统
- 微服务系统
- 面向服务架构
一般传统服务的都是一个系统,MVC都在一个项目中。
但目前基本上服务都是做成分布式系统,灵活,不容易有代码冲突,更适用于请求较多的,容易并发的项目。
那么既然是分布式系统,必然少不了远程调用的框架。
RPC框架有doubbo、SpringCloud、httpclient、soap等等。
soap:http协议+xml的方式,传输效率不高
SpringCloud:http协议+resultful风格+json,一般配合SpringBoot使用
SpringCloud主要组成部分
- 注册中心:eureka
- 接口网关:zuul
- 负载均衡:ribbon
- 远程调用:feign、restful
- 熔断器:Hystrix
注册中心
启动类中要有注解@EnableEurekaClient来启用注册中心
@SpringBootApplication
@EnableEurekaServer
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class, args);
}
}
配置文件
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
接口网关
zuul可以拦截请求,一般是用来解决跨域问题
@EnableZuulProxy 开启接口网关代理
如果要对拦截请求进行操作,例如未登录用户不能浏览,可以继承ZuulFilter类增加拦截请求后所需要的操作
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class AppZuull {
public static void main(String[] args) {
SpringApplication.run(AppZuull.class, args);
}
}
配置文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8082/eureka/
server:
port: 8769
spring:
application:
name: service-zuul
zuul:
routes:
api-a:
path: /api-a/ /**访问地址*/
service-id: a /**注册的服务名称*/
api-b:
path: /api-b/
service-id: b
负载均衡
类似于nignx,通过轮询算法,把请求分配到不同的服务器上。
@LoadBlanced 启用负载均衡
@Bean
@LoadBalanced//开启负载均衡的注解
RestTemplate restTemplate() {
return new RestTemplate();
}
调用工具Feign
@EnableFeignClients(value="扫描路径") /**启用Feign*/
@EnableEurekaClient
@SpringBootApplication
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
@FeignClient(value = "feignTest")/**注册服务的名称*/
public interface feignClient {
@RequestMapping("/addUser")/**服务的方法*/
void save(User user);
}
配置文件
#配置eureka
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8082/eureka/
#服务名称
spring:
application:
name: feignTest
#feign的配置,连接超时及读取超时配置
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
断路器
雪崩效应:服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。
断路器可以防止雪崩效应,提高服务器响应速度
@Component
public class HystrixAppFallBack implements HystrixApp {
public String getList() {
//服务降级处理
return "服务发生异常...";
}
}
@FeignClient(value = "feignTest",fallback=HystrixAppFallBack.class)
public interface HystrixApp {
@RequestMapping("/getList")
public String getList();
}
配置文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8082/eureka/
server:
port: 8765
tomcat:
max-threads: 50
spring:
application:
name: feignTest
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 100000