0%

标识网关@EnableZuulProxy和@EnableZuulServer有什么区别

使用@EnableZuulProxy和@EnableZuulServer注解来标识网关

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaClient // 服务启动后注册到Eureka Server注册中心中
@EnableZuulProxy // 启用zuul
public class ProviderApp {

public static void main(String[] args) {
SpringApplication.run(ProviderApp.class,args);
}
}

@EnableZuulProxy包含了@EnableZuulServer中所有的过滤器,是@EnableZuulServer的超集

可以看到自动配置也是ZuulProxy继承的ZuulServer,所以ZuulProxy实现的内容更多,且ZuulProxy支持Ribbon和DiscoveryClient

1
public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration
阅读全文 »

解决configserver单点问题

之前我们在config的客户端配置configserver的地址是

1
2
3
4
5
6
7
8
9
spring:
application:
name: micro-service-config-client
cloud:
config:
name: micro-service-config-client #github上的资源文件名,对应上述的application,该值默认为${spring.application.name}的值
profile: dev # 环境
label: master # git分支
uri: http://localhost:7010 #spring cloud 服务端地址

但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?

SpringCloudConfig早就想到了这个问题了,微服务可以使用注册中心来防止单点故障,那么configServer也是可以的

阅读全文 »

配置存储

springCloudConfig是使用EnvironmentRepository来存储服务器的配置数据的,返回Environment对象

1
2
3
4
5
6
7
8
9
10
11
public Environment(@JsonProperty("name") String name,
@JsonProperty("profiles") String[] profiles,
@JsonProperty("label") String label, @JsonProperty("version") String version,
@JsonProperty("state") String state) {
super();
this.name = name;
this.profiles = profiles;
this.label = label;
this.version = version;
this.state = state;
}
阅读全文 »

restTemplate拦截器ClientHttpRequestInterceptor

restTemplate提供了一个拦截器链来对请求和响应做一些定制化的操作,只需要实现ClientHttpRequestInterceptor接口中的intercept方法

如添加请求头等操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {


@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

this.traceRequest((ClientHttpRequest) request, body);
ClientHttpResponse response = execution.execute(request, body);
return response;
}

private void traceRequest(ClientHttpRequest request, byte[] body) throws UnsupportedEncodingException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
HttpServletRequest req = ((ServletRequestAttributes) requestAttributes).getRequest();
HttpHeaders headers = new HttpHeaders();

String globalTraceId = req.getHeader("global-trace-id");
if (globalTraceId == null) {
headers.add("global-trace-id", TraceThreadLocal.getGlobalTraceId());
} else {
headers.add("global-trace-id", globalTraceId);
}
String parentTraceId = req.getHeader("local-trace-id");
if (parentTraceId == null) {
headers.add("parent-trace-id", TraceThreadLocal.getLocalTraceId());
} else {
headers.add("parent-trace-id", parentTraceId);
}
request.getHeaders().putAll(headers);
}


}
阅读全文 »

序列化方式

来细数一下目前知道的序列化方式

  • java默认序列化:无法跨语言、序列化后太大且序列化性能差
  • XML:可读性好,但是数据中包含了过多的标签,导致序列化后大且格式复杂,常用于配置文件和数据转换
  • JSON:轻量级的数据格式,兼容性好、数据格式简单且序列化后数据还算小,解析速度也比XML快,只是可读性没有XML好,可以替代XML。性能不适合ms级的情况。常用于小数据量传输,可满足秒级服务
  • Thrift:不仅是序列化方式还是一个RPC框架,序列化后体积小、速度快、支持多种语言和丰富的数据类型、对于数据字段的增删有较强的兼容性,但是不具有可读性且不能与其他传输层协议如HTTP共同使用,无法支持向持久层直接读写数据,不适合做数据持久化序列化协议,常用于作为分布式系统的RPC解决方案
  • Avro:支持丰富的数据类型、简单地动态语言结合功能、具有自我描述属性、提高了数据解析速度,可以实现RPC且支持跨语言实现,在Hadoop中做hive、pig的持久化数据格式
  • Protobuf:将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应的数据结构的POJO对象和Protobuf相关的方法和属性,序列化后比较小,性能高,通过标识字段的顺序可以实现协议的前向兼容,只不过依赖于工具生成代码且支持的语言较少,如果是对于性能要求比较高的RPC调用可以使用该方式
  • protostuff:基于protobuf,不需要配置proto文件
  • Hessian:采用二进制协议的轻量级remoting on http工具
  • kryo:基于protobuf,只支持java语言,需要注册,然后序列化和反序列化