SpringCloud配置中心的使用

在实际的开发过程中,很可能会涉及到很多的开发环境,常见的例如 dev , product 等,在使用SpringCloud的时候可以通过配置中心微服务,结合 Git 管理工具实现配置的集中式管理。

配置中心

config配置中心的yml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
application:
name: sc-config
cloud:
config:
server:
git:
uri: ${GitAddress:https://gitee.com/somersames/spring-cloud-demo-config}
search-paths: ${GitPath:dev}
eureka:
client:
service-url:
defaultZone: http://${EurekaHost:localhost}:${EurekaPort:8081}/eureka/
server:
port: 8888

这里的 ${A:B} 配置表示的是如果 A 获取不到就取 B 的值。
search-paths 则是代表从哪个文件夹中获取配置文件,可以使用 , 来进行分割。
然后在启动类中添加如下几个注解,一个配置中心的微服务便开启了。

阅读更多

Spring Cloud的Zuul相关总结

Zuul是SpringCloud生态体系中的网关一环,首先简单配置如下:
开启注册中心并且配置yml文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: somersames-erueka

server:
port: 8081

eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8081/eureka/

开启用户的微服务:

1
2
3
4
5
6
7
8
9
spring:
application:
name: somersames-user
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka

编写一个测试的Controller:

阅读更多

在nginx中编写rewrite

在使用Nginx做一个反向代理的时候难免会碰到一些特殊的URL,例如获取图片的URL是http://dsda/XXX.jpg,后来由于需要加一个时间戳来获取另外一张图片的话,此时的URL就为http://dsda/XXX.jpg?time=YYYY
当遇到这个情况的时候是有两种选择的,分别如下:

配置location

也就是在nginx中的server里面再加入一个匹配 ,但是这样加入的话若以后不再更改还好,一旦需求再次变更,就会导致配置许多的location。所以这种做法的话如果只是一些固定的URL还是可行的,但是若匹配一些动态的URL则不推荐。
官网的说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name example.org www.example.org;
root /data/www;

location / {
index index.html index.php;
}

location ~* \.(gif|jpg|png)$ {
expires 30d;
}
}

配置rewrite规则

阅读更多

nginx出现403的总结

今天在使用nginx的时候访问首页总是提示403forbidden,经过各种查询之后,总结为如下几种原因:

  1. 访问的资源权限不足,最好将nginx访问的资源权限修改为755或者777
  2. SeLinux的设置为true,需要将其修改为false

如果出现首页的访问资源不是指定的目录的话,可以在/etc/nginx/nginx.conf中添加一条语句root XXX,XXX代表的是资源目录。
其他的暂时没发现什么问题

spring中使用MappingJackson2HttpMessageConverter遇到的一个坑

今天遇到的一个问题就是在Spring中如果继承 WebMvcConfigurerAdapter 然后实现 configureMessageConverters 方法来实现一个 Json 的转换的时候,此时会出现一个情况就是:
如果在Controller里面的那个参数是String的话就会一直提示一个错误 org.springframework.http.converter.HttpMessageNotReadableException","message":"JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: java.io.PushbackInputStream@35b22c23; line: 1, column: 1]","path":"/tetsjson"}
刚开始一直找不出原因,于是在 Spring 源码中 DEBUG :
在如下两处打断点发现是可以获取请求体的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage request, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {

for (RequestBodyAdvice advice : getMatchingAdvice(parameter, RequestBodyAdvice.class)) {
if (advice.supports(parameter, targetType, converterType)) {
request = advice.beforeBodyRead(request, parameter, targetType, converterType);
}
}
return request;
}


@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {

for (RequestBodyAdvice advice : getMatchingAdvice(parameter, RequestBodyAdvice.class)) {
if (advice.supports(parameter, targetType, converterType)) {
body = advice.afterBodyRead(body, inputMessage, parameter, targetType, converterType);
}
}
return body; // 可以正常解析出请求的body
}

但是一旦加上请求头Content-Type : application/json.在方法进入 beforeBodyRead 里面的 for循环 之后便跳转到了 org.springframework.web.servlet.mvc.method.annotationgetMatchingAdvice() 方法,然后继续走下去发现有一处提示如下:

1
2
3
4
5
6
7
8
9
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {

// ConverType :"class org.springframework.http.converter.json.MappingJackson2HttpMessgaeConverter"
return (AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType) &&
methodParameter.getParameterAnnotation(JsonView.class) != null);
// methodParamter: "method 'XXX' 'Controller方法' paramter 0"
}

阅读更多

HTTP请求的ContentType以及其使用范围

在发送请求的是时候最需要注意的是 Content-Type ,因为不同的 Type 对应的则是不同类型的数据,今天正好没什么事情,所以来总结下:

application/json

这种类型在最近几年用的比较多,主要是由于现在前后端分离,数据的请求方式可以由以前的表单提交逐渐偏向于Json的这种格式。所以这种 application/json格式的数据也就越来越多了。

这种数据现在一般使用的较多。
例如,在使用Jquery的时候如果没有指定dataType的话,在后端可以设置 Content-Type 为 application/json 也是可行的。
用 Java 则是

1
response.setHeader("Content-Type","application/json");
阅读更多

Spring Cloud使用ELK日志记录(四)

在ELK的使用过程中,遇到了一点困难, 所以正好写这一篇文章来记录下:

问题一:logstash连接elasticsearch报错

这个问题在这边是由于logstash连接报错,查看了下错误日志发现是由于解析模板出错,后来改了下之后便可以连接了

问题二:kibama可以连接上elasticsearch但是一直读取不了数据

"Couldn't find any Elasticsearch dataYou'll need to index some data into Elasticsearch before you can create an index pattern "
这个问题出现的原因比较复杂,需要仔细排除,不过当出现这个问题的时候可以先看下Elasticsearch 是否含有数据,若是没有数据则添加数据即可。http://localhost:9200/_cat/indices。当这一步没问题了以后,若发现kibana还是无法显示数据则可以在kibana的DevTool里面直接模拟数据。如下:

阅读更多

springcloud的其他组件使用记录之Config(四)

在使用Spring Config的时候遇到一些坑,在这里记录下,顺便梳理下这个使用。

Spring Cloud Config

使用Spring Config来配合git做一个配置文件管理,需要一个Config的服务端和一个Config的客户端,服务端主要是和git仓库进行一个连接,而config的客户端是连接服务端来刷新配置服务的。
在Spring Cloud Config里面客户端需要使用Spring4.0出现的一个注解@Value配合一起使用

Spring Config服务端

需要引入一下几个文件:

阅读更多

springcloud使用feign导致的Excepted authority 错误(三)

今天在用Feign的时候遇到了一个BUG,这个BUG虽然不是很难,但是由于网上没什么解决办法,而是自己的DEBUG解决的,所以暂且记录下:

异常就是java.net.URISyntaxException: Expected authority at index 7: http://,刚开始的时候一头雾水,在Google了一遍之后并未找出解决办法,后来又尝试了在代码中进行了DEBUG,发现代码嵌套的太深了,所以没办法走下去,之后便去StackOverflow中查看了下也没有什么头绪
在这里也检查过了是不是服务没注册还是Feign的注解微服务名称是不是有问题,都显示是正常的,并且可以通过这个名称获取其对应的地址

后来今早起来的时候再次逛StackOverflow看到有人提示try to debug into the LoadBalancerFeignClient.cleanUrl() 。查看了下这个方法的代码:

1
2
3
static URI cleanUrl(String originalUrl, String host) {
return URI.create(originalUrl.replaceFirst(host, ""));
}

猜测了下应该是负责创建Feign相关URL的一个类,所以尝试在这里DEBUG,然后再开启一个正常的可以使用Feign的服务,最后发现这两个服务的区别是,在这个出错的微服务里面发出的请求是http://xxx,而正常的微服务是http://xxx/user/name/XX,所以问题马上就定位出来了,就是请求的问题,

阅读更多

springcloud的服务注册与负载均衡

在springcloud中,服务注册和负载均衡分别是eureka和ribbon。其中eureka是一个服务注册组件,ribbon则是一个负载均衡组件。如果开启了hystrix之后ribbon就默认已经开启了。

Eureka

在使用Eureka的时候服务端开启之后直接在客户端的application.yml中加入如下代码即可:

1
2
3
4
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka/

其中defaultZone代表的是服务端的地址,开启服务之后在eureka的服务面板便会看到这个注册信息。如果需要在这个客户端中加入一些元数据的话可以加入如下配置:

阅读更多