Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
U
unififi-spring-cloud-guide
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lihaipeng
unififi-spring-cloud-guide
Commits
5b01dc64
Commit
5b01dc64
authored
Jul 27, 2020
by
lihaipeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add
parent
8c46b10a
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
605 additions
and
46 deletions
+605
-46
pom.xml
pom.xml
+1
-12
pom.xml
unififi-demo1-service/pom.xml
+12
-9
Demo1Application.java
...1-service/src/main/java/com/unififi/Demo1Application.java
+17
-2
UnififiProperties.java
...e/src/main/java/com/unififi/config/UnififiProperties.java
+20
-0
AdviceConfig.java
...src/main/java/com/unififi/config/advice/AdviceConfig.java
+33
-0
ControllerExceptionHandler.java
...com/unififi/config/advice/ControllerExceptionHandler.java
+1
-1
ControllerLogAdvice.java
...n/java/com/unififi/config/advice/ControllerLogAdvice.java
+110
-0
ServiceExceptionAdvice.java
...ava/com/unififi/config/advice/ServiceExceptionAdvice.java
+34
-0
HttpMessageConverterConfig.java
.../unififi/config/converter/HttpMessageConverterConfig.java
+2
-2
RestTemplateConfig.java
...main/java/com/unififi/config/rest/RestTemplateConfig.java
+33
-4
SwaggerConfig.java
...c/main/java/com/unififi/config/swagger/SwaggerConfig.java
+4
-2
Demo1Controller.java
...src/main/java/com/unififi/controller/Demo1Controller.java
+12
-3
bootstrap.yml
unififi-demo1-service/src/main/resources/bootstrap.yml
+12
-2
pom.xml
unififi-demo2-service/pom.xml
+9
-7
ControllerExceptionHandler.java
...n/java/com/unififi/config/ControllerExceptionHandler.java
+4
-1
ControllerLogAdvice.java
...src/main/java/com/unififi/config/ControllerLogAdvice.java
+109
-0
ControllerLogAdviceConfig.java
...in/java/com/unififi/config/ControllerLogAdviceConfig.java
+28
-0
ServiceExceptionAspect.java
.../main/java/com/unififi/config/ServiceExceptionAspect.java
+35
-0
UnififiProperties.java
...e/src/main/java/com/unififi/config/UnififiProperties.java
+127
-0
Demo2Controller.java
...src/main/java/com/unififi/controller/Demo2Controller.java
+2
-1
No files found.
pom.xml
View file @
5b01dc64
...
...
@@ -6,7 +6,7 @@
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
2.
2.7
.RELEASE
</version>
<version>
2.
3.0
.RELEASE
</version>
<relativePath/>
</parent>
...
...
@@ -57,17 +57,6 @@
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
<version>
2.0.2
</version>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid-spring-boot-starter
</artifactId>
<version>
1.1.21
</version>
</dependency>
</dependencies>
</dependencyManagement>
...
...
unififi-demo1-service/pom.xml
View file @
5b01dc64
...
...
@@ -72,6 +72,7 @@
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid-spring-boot-starter
</artifactId>
<version>
1.1.21
</version>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
...
...
@@ -83,13 +84,13 @@
<artifactId>
mysql-connector-java
</artifactId>
<version>
5.1.49
</version>
</dependency>
<!--
fastjson
-->
<!--
RocketMQ配置
-->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.68
</version>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
<version>
2.0.2
</version>
</dependency>
<!--
r
edis配置 -->
<!--
R
edis配置 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
...
...
@@ -98,16 +99,18 @@
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
<!-- Fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.68
</version>
</dependency>
<!-- 动态配置监听 -->
<dependency>
<groupId>
com.purgeteam
</groupId>
<artifactId>
dynamic-config-spring-boot-starter
</artifactId>
<version>
0.1.0.RELEASE
</version>
</dependency>
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
</dependency>
<!-- 测试相关 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
...
...
unififi-demo1-service/src/main/java/com/unififi/Demo1Application.java
View file @
5b01dc64
package
com
.
unififi
;
import
com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.cloud.client.discovery.EnableDiscoveryClient
;
import
org.springframework.cloud.openfeign.EnableFeignClients
;
import
org.springframework.context.ApplicationContext
;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public
class
Demo1Application
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
Demo1Application
.
class
);
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
Demo1Application
.
class
,
args
);
logger
.
info
(
"Application starting..."
);
ApplicationContext
ac
=
SpringApplication
.
run
(
Demo1Application
.
class
,
args
);
Runtime
.
getRuntime
().
addShutdownHook
(
new
Thread
()
{
@Override
public
void
run
()
{
logger
.
info
(
"Application ShutdownHook..."
);
NacosAutoServiceRegistration
nacosAutoServiceRegistration
=
ac
.
getBean
(
NacosAutoServiceRegistration
.
class
);
if
(
nacosAutoServiceRegistration
!=
null
)
{
nacosAutoServiceRegistration
.
stop
();
}
}
});
}
}
unififi-demo1-service/src/main/java/com/unififi/config/UnififiProperties.java
View file @
5b01dc64
package
com
.
unififi
.
config
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
import
org.springframework.context.annotation.Configuration
;
import
java.util.ArrayList
;
import
java.util.List
;
@Configuration
@RefreshScope
@ConfigurationProperties
(
ignoreInvalidFields
=
true
,
prefix
=
UnififiProperties
.
PREFIX
)
public
class
UnififiProperties
{
...
...
@@ -14,6 +16,8 @@ public class UnififiProperties {
private
Logger
logger
=
new
Logger
();
private
Header
header
=
new
Header
();
private
String
controllerPointcut
=
"execution(* com.*.controller.*.*(..))"
;
private
String
servicePointcut
=
"execution(* com.u2c.service..*.*(..))"
;
public
Logger
getLogger
()
{
return
logger
;
...
...
@@ -31,6 +35,22 @@ public class UnififiProperties {
this
.
header
=
header
;
}
public
String
getControllerPointcut
()
{
return
controllerPointcut
;
}
public
void
setControllerPointcut
(
String
controllerPointcut
)
{
this
.
controllerPointcut
=
controllerPointcut
;
}
public
String
getServicePointcut
()
{
return
servicePointcut
;
}
public
void
setServicePointcut
(
String
servicePointcut
)
{
this
.
servicePointcut
=
servicePointcut
;
}
public
static
class
Logger
{
private
Setting
feign
=
new
Setting
();
private
Setting
rest
=
new
Setting
();
...
...
unififi-demo1-service/src/main/java/com/unififi/config/advice/AdviceConfig.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
.
advice
;
import
com.unififi.config.UnififiProperties
;
import
org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
public
class
AdviceConfig
{
@Bean
@ConditionalOnMissingBean
(
UnififiProperties
.
class
)
UnififiProperties
unififiProperties
()
{
return
new
UnififiProperties
();
}
@Bean
(
value
=
"controllerLogAdvice"
)
public
AspectJExpressionPointcutAdvisor
controllerLogAdvice
(
UnififiProperties
unififiProperties
)
{
AspectJExpressionPointcutAdvisor
advisor
=
new
AspectJExpressionPointcutAdvisor
();
advisor
.
setExpression
(
unififiProperties
.
getControllerPointcut
());
advisor
.
setAdvice
(
new
ControllerLogAdvice
(
unififiProperties
));
return
advisor
;
}
@Bean
(
value
=
"serviceExceptionAdvice"
)
public
AspectJExpressionPointcutAdvisor
serviceExceptionAdvice
(
UnififiProperties
unififiProperties
)
{
AspectJExpressionPointcutAdvisor
advisor
=
new
AspectJExpressionPointcutAdvisor
();
advisor
.
setExpression
(
"execution(* com.*.service..*.*(..))"
);
advisor
.
setAdvice
(
new
ServiceExceptionAdvice
(
unififiProperties
));
return
advisor
;
}
}
unififi-demo1-service/src/main/java/com/unififi/config/
controller
/ControllerExceptionHandler.java
→
unififi-demo1-service/src/main/java/com/unififi/config/
advice
/ControllerExceptionHandler.java
View file @
5b01dc64
package
com
.
unififi
.
config
.
controller
;
package
com
.
unififi
.
config
.
advice
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.web.HttpRequestMethodNotSupportedException
;
...
...
unififi-demo1-service/src/main/java/com/unififi/config/
controller/ControllerLogAspect
.java
→
unififi-demo1-service/src/main/java/com/unififi/config/
advice/ControllerLogAdvice
.java
View file @
5b01dc64
package
com
.
unififi
.
config
.
controller
;
package
com
.
unififi
.
config
.
advice
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.unififi.config.UnififiProperties
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Pointcut
;
import
org.aopalliance.intercept.MethodInterceptor
;
import
org.aopalliance.intercept.MethodInvocation
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.context.request.RequestAttributes
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.lang.reflect.Method
;
import
java.util.concurrent.TimeUnit
;
@Aspect
@Component
public
class
ControllerLogAspect
{
public
class
ControllerLogAdvice
implements
MethodInterceptor
{
private
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
"ControllerLog"
);
@Autowired
private
UnififiProperties
unififiProperties
;
@Pointcut
(
"execution(* com.unififi.controller.*.*(..))"
)
public
void
printLog
()
{
public
ControllerLogAdvice
(
UnififiProperties
unififiProperties
)
{
this
.
unififiProperties
=
unififiProperties
;
}
@Around
(
"printLog()"
)
private
Object
doAround
(
ProceedingJoinPoint
pjp
)
{
@Override
public
Object
invoke
(
MethodInvocation
invocation
)
throws
Throwable
{
String
sortMethodName
=
getSortMethodName
(
invocation
.
getMethod
());
try
{
long
start
=
System
.
nanoTime
();
RequestAttributes
ra
=
RequestContextHolder
.
getRequestAttributes
();
HttpServletRequest
request
=
((
ServletRequestAttributes
)
ra
).
getRequest
();
String
requestData
=
null
;
if
(
"POST"
.
equalsIgnoreCase
(
request
.
getMethod
())
||
"PUT"
.
equalsIgnoreCase
(
request
.
getMethod
()))
{
requestData
=
JSONArray
.
toJSONString
(
pjp
.
getArg
s
());
requestData
=
JSONArray
.
toJSONString
(
invocation
.
getArgument
s
());
}
else
if
(
"GET"
.
equalsIgnoreCase
(
request
.
getMethod
()))
{
requestData
=
request
.
getQueryString
();
}
if
(
logger
.
isInfoEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
pjp
.
getSignature
().
toShortString
()
))
{
logger
.
info
(
"UNIFIFI-REQ-[{}] {}"
,
pjp
.
getSignature
().
toShortString
()
,
(
requestData
!=
null
?
requestData
:
""
));
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
sortMethodName
))
{
logger
.
info
(
"UNIFIFI-REQ-[{}] {}"
,
sortMethodName
,
(
requestData
!=
null
?
requestData
:
""
));
}
}
Object
result
=
pjp
.
proceed
();
Object
result
=
invocation
.
proceed
();
long
elapsedTime
=
TimeUnit
.
NANOSECONDS
.
toMillis
(
System
.
nanoTime
()
-
start
);
String
responseData
=
null
;
if
(
result
!=
null
)
{
responseData
=
JSON
.
toJSONString
(
result
);
}
if
(
logger
.
isInfoEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
pjp
.
getSignature
().
toShortString
()
))
{
if
(
unififiProperties
.
getLogger
().
getController
().
getIgnoreResponseDataMethodSigns
().
contains
(
pjp
.
getSignature
().
toShortString
()
))
{
logger
.
info
(
"UNIFIFI-RESP-[{}] IGNORE_DATA size:{} spend:{}ms"
,
pjp
.
getSignature
().
toShortString
()
,
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
sortMethodName
))
{
if
(
unififiProperties
.
getLogger
().
getController
().
getIgnoreResponseDataMethodSigns
().
contains
(
sortMethodName
))
{
logger
.
info
(
"UNIFIFI-RESP-[{}] IGNORE_DATA size:{} spend:{}ms"
,
sortMethodName
,
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
}
else
{
logger
.
info
(
"UNIFIFI-RESP-[{}] {} size:{} spend:{}ms"
,
pjp
.
getSignature
().
toShortString
()
,
(
responseData
!=
null
?
responseData
:
""
),
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
logger
.
info
(
"UNIFIFI-RESP-[{}] {} size:{} spend:{}ms"
,
sortMethodName
,
(
responseData
!=
null
?
responseData
:
""
),
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
}
}
}
return
result
;
}
catch
(
Throwable
throwable
)
{
if
(
logger
.
isErrorEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
logger
.
error
(
"UNIFIFI-RESP-[{}] [{}]{}"
,
pjp
.
getSignature
().
toShortString
()
,
throwable
.
getClass
().
getSimpleName
(),
throwable
.
getMessage
());
logger
.
error
(
"UNIFIFI-RESP-[{}] [{}]{}"
,
sortMethodName
,
throwable
.
getClass
().
getSimpleName
(),
throwable
.
getMessage
());
}
return
throwable
;
}
}
private
String
getSortMethodName
(
Method
method
)
{
StringBuilder
sb
=
new
StringBuilder
();
appendType
(
sb
,
method
.
getDeclaringClass
(),
false
);
sb
.
append
(
"."
);
sb
.
append
(
method
.
getName
());
sb
.
append
(
"("
);
Class
<?>[]
parametersTypes
=
method
.
getParameterTypes
();
appendTypes
(
sb
,
parametersTypes
,
false
,
false
);
sb
.
append
(
")"
);
return
sb
.
toString
();
}
private
void
appendTypes
(
StringBuilder
sb
,
Class
<?>[]
types
,
boolean
includeArgs
,
boolean
useLongReturnAndArgumentTypeName
)
{
if
(
includeArgs
)
{
for
(
int
size
=
types
.
length
,
i
=
0
;
i
<
size
;
i
++)
{
appendType
(
sb
,
types
[
i
],
useLongReturnAndArgumentTypeName
);
if
(
i
<
size
-
1
)
{
sb
.
append
(
","
);
}
}
}
else
{
if
(
types
.
length
!=
0
)
{
sb
.
append
(
".."
);
}
}
}
private
void
appendType
(
StringBuilder
sb
,
Class
<?>
type
,
boolean
useLongTypeName
)
{
if
(
type
.
isArray
())
{
appendType
(
sb
,
type
.
getComponentType
(),
useLongTypeName
);
sb
.
append
(
"[]"
);
}
else
{
sb
.
append
(
useLongTypeName
?
type
.
getName
()
:
type
.
getSimpleName
());
}
}
}
unififi-demo1-service/src/main/java/com/unififi/config/advice/ServiceExceptionAdvice.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
.
advice
;
import
com.unififi.config.UnififiProperties
;
import
org.aopalliance.intercept.MethodInterceptor
;
import
org.aopalliance.intercept.MethodInvocation
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
ServiceExceptionAdvice
implements
MethodInterceptor
{
private
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceExceptionAdvice
.
class
);
private
UnififiProperties
unififiProperties
;
public
ServiceExceptionAdvice
(
UnififiProperties
unififiProperties
)
{
this
.
unififiProperties
=
unififiProperties
;
}
@Override
public
Object
invoke
(
MethodInvocation
invocation
)
throws
Throwable
{
try
{
return
invocation
.
proceed
();
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"ServiceException: "
,
throwable
);
Map
map
=
new
HashMap
();
map
.
put
(
"code"
,
500
);
map
.
put
(
"msg"
,
"系统错误"
);
return
map
;
}
}
}
unififi-demo1-service/src/main/java/com/unififi/config/con
troll
er/HttpMessageConverterConfig.java
→
unififi-demo1-service/src/main/java/com/unififi/config/con
vert
er/HttpMessageConverterConfig.java
View file @
5b01dc64
package
com
.
unififi
.
config
.
con
troll
er
;
package
com
.
unififi
.
config
.
con
vert
er
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
com.alibaba.fastjson.support.config.FastJsonConfig
;
import
com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
;
import
org.apache.commons.codec
.Charsets
;
import
com.google.common.base
.Charsets
;
import
org.springframework.boot.autoconfigure.http.HttpMessageConverters
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
...
...
unififi-demo1-service/src/main/java/com/unififi/config/rest/RestTemplateConfig.java
View file @
5b01dc64
...
...
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import
com.google.common.base.Charsets
;
import
com.unififi.config.UnififiProperties
;
import
org.apache.http.client.HttpClient
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.cloud.client.loadbalancer.LoadBalanced
;
import
org.springframework.context.annotation.Bean
;
...
...
@@ -23,6 +24,11 @@ import java.util.List;
@Configuration
public
class
RestTemplateConfig
{
@Value
(
"${ribbon.ConnectTimeout:5000}"
)
private
Integer
connectTimeout
;
@Value
(
"${ribbon.ReadTimeout:60000}"
)
private
Integer
readTimeout
;
@Bean
@ConditionalOnMissingBean
(
UnififiProperties
.
class
)
UnififiProperties
loggerConfig
()
{
...
...
@@ -32,13 +38,12 @@ public class RestTemplateConfig {
@Bean
public
ClientHttpRequestFactory
httpRequestFactory
(
HttpClient
httpClient
)
{
HttpComponentsClientHttpRequestFactory
httpComponentsClientHttpRequestFactory
=
new
HttpComponentsClientHttpRequestFactory
(
httpClient
);
httpComponentsClientHttpRequestFactory
.
setConnectTimeout
(
5000
);
httpComponentsClientHttpRequestFactory
.
setReadTimeout
(
60000
);
httpComponentsClientHttpRequestFactory
.
setConnectTimeout
(
this
.
connectTimeout
);
httpComponentsClientHttpRequestFactory
.
setReadTimeout
(
this
.
readTimeout
);
return
httpComponentsClientHttpRequestFactory
;
}
@LoadBalanced
@Bean
@Bean
(
value
=
"restTemplate"
)
public
RestTemplate
restTemplate
(
ClientHttpRequestFactory
httpRequestFactory
,
UnififiProperties
unififiProperties
,
FastJsonHttpMessageConverter
fastJsonHttpMessageConverter
)
{
BufferingClientHttpRequestFactory
bufferingClientHttpRequestFactory
=
new
BufferingClientHttpRequestFactory
(
httpRequestFactory
);
RestTemplate
restTemplate
=
new
RestTemplate
(
bufferingClientHttpRequestFactory
);
...
...
@@ -60,4 +65,28 @@ public class RestTemplateConfig {
messageConverters
.
add
(
fastJsonHttpMessageConverter
);
return
restTemplate
;
}
@LoadBalanced
@Bean
(
value
=
"restTemplateRibbon"
)
public
RestTemplate
restTemplateRibbon
(
ClientHttpRequestFactory
httpRequestFactory
,
UnififiProperties
unififiProperties
,
FastJsonHttpMessageConverter
fastJsonHttpMessageConverter
)
{
BufferingClientHttpRequestFactory
bufferingClientHttpRequestFactory
=
new
BufferingClientHttpRequestFactory
(
httpRequestFactory
);
RestTemplate
restTemplate
=
new
RestTemplate
(
bufferingClientHttpRequestFactory
);
restTemplate
.
getInterceptors
().
add
(
new
RestTemplateLogInterceptor
(
unififiProperties
.
getLogger
().
getRest
()));
//fastjson 替换 jackson
List
<
HttpMessageConverter
<?>>
messageConverters
=
restTemplate
.
getMessageConverters
();
Iterator
<
HttpMessageConverter
<?>>
iterator
=
messageConverters
.
iterator
();
while
(
iterator
.
hasNext
())
{
HttpMessageConverter
<?>
converter
=
iterator
.
next
();
if
(
converter
instanceof
StringHttpMessageConverter
)
{
iterator
.
remove
();
}
if
(
converter
instanceof
GsonHttpMessageConverter
||
converter
instanceof
MappingJackson2HttpMessageConverter
)
{
iterator
.
remove
();
}
}
messageConverters
.
add
(
new
StringHttpMessageConverter
(
Charsets
.
UTF_8
));
messageConverters
.
add
(
fastJsonHttpMessageConverter
);
return
restTemplate
;
}
}
unififi-demo1-service/src/main/java/com/unififi/config/swagger/SwaggerConfig.java
View file @
5b01dc64
...
...
@@ -20,12 +20,14 @@ public class SwaggerConfig {
@Value
(
"${swagger.enable:false}"
)
private
Boolean
enable
;
@Value
(
"${spring.cloud.nacos.discovery.metadata.unififi.
service.
version}"
)
@Value
(
"${spring.cloud.nacos.discovery.metadata.unififi.version}"
)
private
String
serviceVersion
;
@Value
(
"${spring.application.name}"
)
private
String
serviceName
;
private
static
final
String
basePackage
=
"com.unififi.controller"
;
@Bean
public
Docket
docket
()
{
return
new
Docket
(
DocumentationType
.
SWAGGER_2
)
...
...
@@ -34,7 +36,7 @@ public class SwaggerConfig {
.
genericModelSubstitutes
(
Response
.
class
)
.
forCodeGeneration
(
true
)
.
select
()
.
apis
(
RequestHandlerSelectors
.
basePackage
(
"com.unififi.controller"
))
.
apis
(
RequestHandlerSelectors
.
basePackage
(
basePackage
))
.
paths
(
PathSelectors
.
any
())
.
build
();
}
...
...
unififi-demo1-service/src/main/java/com/unififi/controller/Demo1Controller.java
View file @
5b01dc64
...
...
@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
import
org.springframework.web.client.RestTemplate
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.validation.Valid
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.concurrent.TimeUnit
;
...
...
@@ -29,6 +30,8 @@ public class Demo1Controller {
@Autowired
private
RestTemplate
restTemplate
;
@Autowired
private
RestTemplate
restTemplateRibbon
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@Autowired
private
UserApi
userApi
;
...
...
@@ -51,14 +54,20 @@ public class Demo1Controller {
}
@PostMapping
(
value
=
"/user/add"
,
produces
=
MediaType
.
APPLICATION_JSON_VALUE
,
consumes
=
MediaType
.
APPLICATION_JSON_VALUE
)
public
Boolean
userAdd
(
@RequestBody
User
user
)
{
public
Boolean
userAdd
(
@
Valid
@
RequestBody
User
user
)
{
return
userService
.
add
(
user
);
}
@GetMapping
(
"/user/get"
)
public
User
userGet
(
@RequestParam
(
"name"
)
String
name
,
@RequestParam
(
"age"
)
Integer
age
)
{
log
.
info
(
"header. token:{}"
,
request
.
getHeader
(
"token"
));
return
userApi
.
get
(
name
,
age
);
User
user
=
null
;
user
=
userApi
.
get
(
name
,
age
);
// try {
// } catch (Exception e) {
// log.error("Exception:", e);
// }
return
user
;
}
@GetMapping
(
"/user/get/v2"
)
...
...
@@ -71,7 +80,7 @@ public class Demo1Controller {
public
List
<
User
>
userList
()
{
// return userApi.list();
log
.
info
(
"header. token:{}"
,
request
.
getHeader
(
"token"
));
return
restTemplate
.
getForObject
(
"http://unififi-demo2-service/user/list"
,
List
.
class
);
return
restTemplate
Ribbon
.
getForObject
(
"http://unififi-demo2-service/user/list"
,
List
.
class
);
}
@GetMapping
(
"/config/username"
)
...
...
unififi-demo1-service/src/main/resources/bootstrap.yml
View file @
5b01dc64
...
...
@@ -8,7 +8,10 @@ server:
web
:
exposure
:
include
:
'
*'
shutdown
:
graceful
spring
:
lifecycle
:
timeout-per-shutdown-phase
:
60s
profiles
:
active
:
dev
application
:
...
...
@@ -37,11 +40,18 @@ spring:
discovery
:
#ip: 39.106.6.97
metadata
:
unififi.mode
:
${unififi.mode:}
unififi.env
:
${spring.profiles.active:}
unififi.
service.
version
:
'
@unififi-service.version@'
unififi.version
:
'
@unififi-service.version@'
user.home
:
${user.home}
# 测试时使用配置服务列表
#unififi-demo2-service:
# ribbon:
# NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
# listOfServers: 39.106.6.97:18080
\ No newline at end of file
# listOfServers: 39.106.6.97:18080
unififi
:
#controller-pointcut: 'execution(* com.*.controller.*.*(..))'
swagger
:
enable
:
true
\ No newline at end of file
unififi-demo2-service/pom.xml
View file @
5b01dc64
...
...
@@ -63,6 +63,7 @@
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid-spring-boot-starter
</artifactId>
<version>
1.1.21
</version>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
...
...
@@ -74,8 +75,13 @@
<artifactId>
mysql-connector-java
</artifactId>
<version>
5.1.49
</version>
</dependency>
<!-- redis配置 -->
<!-- RocketMQ配置 -->
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
<version>
2.0.2
</version>
</dependency>
<!-- Redis配置 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-redis
</artifactId>
...
...
@@ -84,16 +90,12 @@
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
<!-- Fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.68
</version>
</dependency>
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
<artifactId>
rocketmq-spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
...
...
unififi-demo2-service/src/main/java/com/unififi/config/ControllerExceptionHandler.java
View file @
5b01dc64
...
...
@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.web.HttpRequestMethodNotSupportedException
;
import
org.springframework.web.bind.MethodArgumentNotValidException
;
import
org.springframework.web.bind.annotation.ExceptionHandler
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.RestControllerAdvice
;
import
java.util.HashMap
;
...
...
@@ -15,7 +16,7 @@ import java.util.Map;
@Slf4j
@RestControllerAdvice
public
class
ControllerExceptionHandler
{
@ResponseBody
@ExceptionHandler
(
Exception
.
class
)
public
Map
handleException
(
Exception
e
)
{
Map
map
=
new
HashMap
();
...
...
@@ -25,6 +26,7 @@ public class ControllerExceptionHandler {
return
map
;
}
@ResponseBody
@ExceptionHandler
(
HttpRequestMethodNotSupportedException
.
class
)
public
Map
handleHttpRequestMethodNotSupportedException
(
HttpRequestMethodNotSupportedException
e
)
{
Map
map
=
new
HashMap
();
...
...
@@ -34,6 +36,7 @@ public class ControllerExceptionHandler {
return
map
;
}
@ResponseBody
@ExceptionHandler
(
MethodArgumentNotValidException
.
class
)
public
Map
handleMethodArgumentNotValidException
(
MethodArgumentNotValidException
e
)
{
Map
map
=
new
HashMap
();
...
...
unififi-demo2-service/src/main/java/com/unififi/config/ControllerLogAdvice.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
org.aopalliance.intercept.MethodInterceptor
;
import
org.aopalliance.intercept.MethodInvocation
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.web.context.request.RequestAttributes
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.lang.reflect.Method
;
import
java.util.concurrent.TimeUnit
;
public
class
ControllerLogAdvice
implements
MethodInterceptor
{
private
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
"ControllerLog"
);
private
UnififiProperties
unififiProperties
;
public
ControllerLogAdvice
(
UnififiProperties
unififiProperties
)
{
this
.
unififiProperties
=
unififiProperties
;
}
@Override
public
Object
invoke
(
MethodInvocation
invocation
)
throws
Throwable
{
String
sortMethodName
=
getSortMethodName
(
invocation
.
getMethod
());
try
{
long
start
=
System
.
nanoTime
();
RequestAttributes
ra
=
RequestContextHolder
.
getRequestAttributes
();
HttpServletRequest
request
=
((
ServletRequestAttributes
)
ra
).
getRequest
();
String
requestData
=
null
;
if
(
"POST"
.
equalsIgnoreCase
(
request
.
getMethod
())
||
"PUT"
.
equalsIgnoreCase
(
request
.
getMethod
()))
{
requestData
=
JSONArray
.
toJSONString
(
invocation
.
getArguments
());
}
else
if
(
"GET"
.
equalsIgnoreCase
(
request
.
getMethod
()))
{
requestData
=
request
.
getQueryString
();
}
if
(
logger
.
isInfoEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
sortMethodName
))
{
logger
.
info
(
"UNIFIFI-REQ-[{}] {}"
,
sortMethodName
,
(
requestData
!=
null
?
requestData
:
""
));
}
}
Object
result
=
invocation
.
proceed
();
long
elapsedTime
=
TimeUnit
.
NANOSECONDS
.
toMillis
(
System
.
nanoTime
()
-
start
);
String
responseData
=
null
;
if
(
result
!=
null
)
{
responseData
=
JSON
.
toJSONString
(
result
);
}
if
(
logger
.
isInfoEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
if
(!
unififiProperties
.
getLogger
().
getController
().
getSkipMethodSigns
().
contains
(
sortMethodName
))
{
if
(
unififiProperties
.
getLogger
().
getController
().
getIgnoreResponseDataMethodSigns
().
contains
(
sortMethodName
))
{
logger
.
info
(
"UNIFIFI-RESP-[{}] IGNORE_DATA size:{} spend:{}ms"
,
sortMethodName
,
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
}
else
{
logger
.
info
(
"UNIFIFI-RESP-[{}] {} size:{} spend:{}ms"
,
sortMethodName
,
(
responseData
!=
null
?
responseData
:
""
),
(
responseData
!=
null
?
responseData
.
length
()
:
0
),
elapsedTime
);
}
}
}
return
result
;
}
catch
(
Throwable
throwable
)
{
if
(
logger
.
isErrorEnabled
()
&&
unififiProperties
.
getLogger
().
getController
().
isEnabled
())
{
logger
.
error
(
"UNIFIFI-RESP-[{}] [{}]{}"
,
sortMethodName
,
throwable
.
getClass
().
getSimpleName
(),
throwable
.
getMessage
());
}
return
throwable
;
}
}
private
String
getSortMethodName
(
Method
method
)
{
StringBuilder
sb
=
new
StringBuilder
();
appendType
(
sb
,
method
.
getDeclaringClass
(),
false
);
sb
.
append
(
"."
);
sb
.
append
(
method
.
getName
());
sb
.
append
(
"("
);
Class
<?>[]
parametersTypes
=
method
.
getParameterTypes
();
appendTypes
(
sb
,
parametersTypes
,
false
,
false
);
sb
.
append
(
")"
);
return
sb
.
toString
();
}
private
void
appendTypes
(
StringBuilder
sb
,
Class
<?>[]
types
,
boolean
includeArgs
,
boolean
useLongReturnAndArgumentTypeName
)
{
if
(
includeArgs
)
{
for
(
int
size
=
types
.
length
,
i
=
0
;
i
<
size
;
i
++)
{
appendType
(
sb
,
types
[
i
],
useLongReturnAndArgumentTypeName
);
if
(
i
<
size
-
1
)
{
sb
.
append
(
","
);
}
}
}
else
{
if
(
types
.
length
!=
0
)
{
sb
.
append
(
".."
);
}
}
}
private
void
appendType
(
StringBuilder
sb
,
Class
<?>
type
,
boolean
useLongTypeName
)
{
if
(
type
.
isArray
())
{
appendType
(
sb
,
type
.
getComponentType
(),
useLongTypeName
);
sb
.
append
(
"[]"
);
}
else
{
sb
.
append
(
useLongTypeName
?
type
.
getName
()
:
type
.
getSimpleName
());
}
}
}
unififi-demo2-service/src/main/java/com/unififi/config/ControllerLogAdviceConfig.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
;
import
org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
public
class
ControllerLogAdviceConfig
{
@Value
(
"${unififi.controller-pointcut:execution(* com.unififi.controller.*.*(..))}"
)
private
String
pointcut
;
@Bean
@ConditionalOnMissingBean
(
UnififiProperties
.
class
)
UnififiProperties
unififiProperties
()
{
return
new
UnififiProperties
();
}
@Bean
public
AspectJExpressionPointcutAdvisor
configurabledvisor
(
UnififiProperties
unififiProperties
)
{
AspectJExpressionPointcutAdvisor
advisor
=
new
AspectJExpressionPointcutAdvisor
();
advisor
.
setExpression
(
pointcut
);
advisor
.
setAdvice
(
new
ControllerLogAdvice
(
unififiProperties
));
return
advisor
;
}
}
unififi-demo2-service/src/main/java/com/unififi/config/ServiceExceptionAspect.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
;
import
com.unififi.model.User
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Pointcut
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
@Aspect
@Component
public
class
ServiceExceptionAspect
{
private
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
"ServiceExceptionAspect"
);
@Pointcut
(
"execution(* com.unififi.service..*.*(..))"
)
public
void
printLog
()
{
}
@Around
(
"printLog()"
)
private
Object
doAround
(
ProceedingJoinPoint
pjp
)
{
try
{
return
pjp
.
proceed
();
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"ServiceException:"
,
throwable
);
User
u
=
new
User
();
u
.
setAge
(-
1
);
u
.
setName
(
throwable
.
getMessage
());
return
u
;
}
}
}
unififi-demo2-service/src/main/java/com/unififi/config/UnififiProperties.java
0 → 100644
View file @
5b01dc64
package
com
.
unififi
.
config
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Configuration
;
import
java.util.ArrayList
;
import
java.util.List
;
@Configuration
@ConfigurationProperties
(
ignoreInvalidFields
=
true
,
prefix
=
UnififiProperties
.
PREFIX
)
public
class
UnififiProperties
{
public
static
final
String
PREFIX
=
"unififi"
;
private
Logger
logger
=
new
Logger
();
private
Header
header
=
new
Header
();
private
String
controllerPointcut
=
""
;
public
Logger
getLogger
()
{
return
logger
;
}
public
void
setLogger
(
Logger
logger
)
{
this
.
logger
=
logger
;
}
public
Header
getHeader
()
{
return
header
;
}
public
void
setHeader
(
Header
header
)
{
this
.
header
=
header
;
}
public
String
getControllerPointcut
()
{
return
controllerPointcut
;
}
public
void
setControllerPointcut
(
String
controllerPointcut
)
{
this
.
controllerPointcut
=
controllerPointcut
;
}
public
static
class
Logger
{
private
Setting
feign
=
new
Setting
();
private
Setting
rest
=
new
Setting
();
private
Setting
controller
=
new
Setting
();
public
Setting
getFeign
()
{
return
feign
;
}
public
void
setFeign
(
Setting
feign
)
{
this
.
feign
=
feign
;
}
public
Setting
getRest
()
{
return
rest
;
}
public
void
setRest
(
Setting
rest
)
{
this
.
rest
=
rest
;
}
public
Setting
getController
()
{
return
controller
;
}
public
void
setController
(
Setting
controller
)
{
this
.
controller
=
controller
;
}
}
public
static
class
Header
{
private
List
<
String
>
throughNames
=
new
ArrayList
<>();
public
List
<
String
>
getThroughNames
()
{
return
throughNames
;
}
public
void
setThroughNames
(
List
<
String
>
throughNames
)
{
this
.
throughNames
=
throughNames
;
}
}
public
static
class
Setting
{
private
boolean
enabled
=
true
;
private
List
<
String
>
ignoreResponseDataMethodSigns
=
new
ArrayList
<>();
private
List
<
String
>
skipMethodSigns
=
new
ArrayList
<>();
private
boolean
showSpendms
=
false
;
public
boolean
isEnabled
()
{
return
enabled
;
}
public
void
setEnabled
(
boolean
enabled
)
{
this
.
enabled
=
enabled
;
}
public
List
<
String
>
getIgnoreResponseDataMethodSigns
()
{
return
ignoreResponseDataMethodSigns
;
}
public
void
setIgnoreResponseDataMethodSigns
(
List
<
String
>
ignoreResponseDataMethodSigns
)
{
this
.
ignoreResponseDataMethodSigns
=
ignoreResponseDataMethodSigns
;
}
public
List
<
String
>
getSkipMethodSigns
()
{
return
skipMethodSigns
;
}
public
void
setSkipMethodSigns
(
List
<
String
>
skipMethodSigns
)
{
this
.
skipMethodSigns
=
skipMethodSigns
;
}
public
boolean
isShowSpendms
()
{
return
showSpendms
;
}
public
void
setShowSpendms
(
boolean
showSpendms
)
{
this
.
showSpendms
=
showSpendms
;
}
}
}
unififi-demo2-service/src/main/java/com/unififi/controller/Demo2Controller.java
View file @
5b01dc64
...
...
@@ -13,6 +13,7 @@ import org.springframework.http.MediaType;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.validation.Valid
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -36,7 +37,7 @@ public class Demo2Controller implements UserApi {
@Override
@PostMapping
(
value
=
"/user/add"
,
produces
=
MediaType
.
APPLICATION_JSON_VALUE
,
consumes
=
MediaType
.
APPLICATION_JSON_VALUE
)
public
Boolean
add
(
@RequestBody
User
user
)
{
public
Boolean
add
(
@RequestBody
@Valid
User
user
)
{
log
.
info
(
"user/add. {}"
,
JSON
.
toJSONString
(
user
));
return
userService
.
add
(
user
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment