From 258ce7dcfed9efc3ea412012618a53bc42063281 Mon Sep 17 00:00:00 2001 From: lynnlovemin <331509758@qq.com> Date: Fri, 26 Jul 2019 10:52:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dredis=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=94=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springcloud/config/pom.xml" | 6 +- .../java/com/lynn/config/Application.java" | 6 +- .../src/main/resources/application.yml" | 18 ++-- .../springcloud/eurekaclient/pom.xml" | 14 ++- .../src/main/java/com/lynn/Application.java" | 6 +- .../src/main/resources/bootstrap.yml" | 22 +++-- .../springcloud/eurekaserver/pom.xml" | 10 +- .../src/main/java/com/lynn/Application.java" | 4 +- .../src/main/resources/application.yml" | 21 +++-- .../springcloud/feign/pom.xml" | 12 ++- .../java/com/lynn/feign/ApiController.java" | 2 +- .../main/java/com/lynn/feign/ApiService.java" | 2 +- .../java/com/lynn/feign/ApiServiceError.java" | 2 +- .../java/com/lynn/feign/Application.java" | 24 +++-- .../feign/src/main/resources/application.yml" | 1 + .../springcloud/gateway/pom.xml" | 12 ++- .../lynn/gateway/ApiFallbackProvider.java" | 64 ------------- .../java/com/lynn/gateway/ApiFilter.java" | 42 --------- .../com/lynn/gateway/ApiGlobalFilter.java" | 36 ++++++++ .../java/com/lynn/gateway/Application.java" | 9 +- .../gateway/ErrorHandlerConfiguration.java" | 65 +++++++++++++ .../lynn/gateway/JsonExceptionHandler.java" | 91 +++++++++++++++++++ .../src/main/resources/application.yml" | 24 +++-- .../springcloud/pom.xml" | 10 +- .../springcloud/eurekaclient/pom.xml" | 2 +- .../com/lynn/demo/config/MyBatisConfig2.java" | 2 +- .../lynn/demo/lock/RedissonConnector.java" | 14 ++- .../com/lynn/demo/service/UserService.java" | 4 + .../demo/src/main/resources/application.yml" | 2 +- 29 files changed, 344 insertions(+), 183 deletions(-) delete mode 100755 "\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFallbackProvider.java" delete mode 100755 "\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFilter.java" create mode 100644 "\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiGlobalFilter.java" create mode 100644 "\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ErrorHandlerConfiguration.java" create mode 100644 "\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/JsonExceptionHandler.java" diff --git "a/\347\254\25410\350\257\276/springcloud/config/pom.xml" "b/\347\254\25410\350\257\276/springcloud/config/pom.xml" index 446abc7..5e18d7e 100644 --- "a/\347\254\25410\350\257\276/springcloud/config/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/config/pom.xml" @@ -14,15 +14,15 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-config-server org.springframework.cloud - spring-cloud-config-server + spring-cloud-starter-netflix-eureka-client org.springframework.cloud - spring-cloud-starter-bus-amqp + spring-cloud-starter-netflix-hystrix \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/config/src/main/java/com/lynn/config/Application.java" "b/\347\254\25410\350\257\276/springcloud/config/src/main/java/com/lynn/config/Application.java" index 2a06c01..93b6c00 100644 --- "a/\347\254\25410\350\257\276/springcloud/config/src/main/java/com/lynn/config/Application.java" +++ "b/\347\254\25410\350\257\276/springcloud/config/src/main/java/com/lynn/config/Application.java" @@ -1,12 +1,10 @@ package com.lynn.config; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.config.server.EnableConfigServer; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -@SpringBootApplication -@EnableEurekaClient +@SpringCloudApplication @EnableConfigServer public class Application { diff --git "a/\347\254\25410\350\257\276/springcloud/config/src/main/resources/application.yml" "b/\347\254\25410\350\257\276/springcloud/config/src/main/resources/application.yml" index 8c44201..2d537ab 100644 --- "a/\347\254\25410\350\257\276/springcloud/config/src/main/resources/application.yml" +++ "b/\347\254\25410\350\257\276/springcloud/config/src/main/resources/application.yml" @@ -6,29 +6,27 @@ spring: profiles: active: dev cloud: - bus: - trace: - enable: true config: server: git: uri: https://github.com/lynnlovemin/SpringCloudLesson.git #配置git仓库地址 searchPaths: 第09课/config #配置仓库路径 username: lynnlovemin #访问git仓库的用户名 - password: ****** #访问git仓库的用户密码 + password: 1qaz,2wsx,3edc. #访问git仓库的用户密码 label: master #配置仓库的分支 rabbitmq: - host: localhost + host: 127.0.0.1 port: 5672 username: guest password: guest + virtualHost: / + publisherConfirms: true eureka: - instance: - hostname: ${spring.cloud.client.ipAddress} - instanceId: ${spring.cloud.client.ipAddress}:${server.port} client: serviceUrl: defaultZone: http://localhost:8761/eureka/ management: - security: - enabled: false + endpoints: + web: + exposure: + include: refresh,health,info,bus-refresh,bus-trace \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaclient/pom.xml" "b/\347\254\25410\350\257\276/springcloud/eurekaclient/pom.xml" index a66a5f5..73c40cd 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaclient/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaclient/pom.xml" @@ -14,12 +14,24 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-netflix-eureka-client + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + org.springframework.boot + spring-boot-starter-web org.springframework.cloud spring-cloud-starter-config + + org.springframework.boot + spring-boot-starter-actuator + org.springframework.cloud spring-cloud-starter-bus-amqp diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/java/com/lynn/Application.java" "b/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/java/com/lynn/Application.java" index f5864a7..75c3f1f 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/java/com/lynn/Application.java" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/java/com/lynn/Application.java" @@ -1,11 +1,9 @@ package com.lynn; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.client.SpringCloudApplication; -@SpringBootApplication -@EnableEurekaClient +@SpringCloudApplication public class Application { public static void main(String[] args) { diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/resources/bootstrap.yml" "b/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/resources/bootstrap.yml" index f37d832..9ac3172 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/resources/bootstrap.yml" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaclient/src/main/resources/bootstrap.yml" @@ -1,13 +1,19 @@ spring: - application: - name: eurekaclient - profiles: - active: dev cloud: config: - profile: dev #指定配置环境,配置文件如果是多环境则取名类似:config-dev.yml - name: eurekaclient #指定配置文件名字(多个配置文件以英文逗号隔开) - label: master #git仓库分支名 + name: eurekaclient + label: master discovery: enabled: true - serviceId: config #连接的配置中心名字(applicaiton.name) \ No newline at end of file + serviceId: config + rabbitmq: + host: 127.0.0.1 + port: 5672 + username: guest + password: guest + virtualHost: / + publisherConfirms: true +eureka: + client: + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaserver/pom.xml" "b/\347\254\25410\350\257\276/springcloud/eurekaserver/pom.xml" index e912a81..31c7db5 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaserver/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaserver/pom.xml" @@ -14,7 +14,15 @@ org.springframework.cloud - spring-cloud-starter-eureka-server + spring-cloud-starter-netflix-eureka-server + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/java/com/lynn/Application.java" "b/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/java/com/lynn/Application.java" index f117439..13be653 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/java/com/lynn/Application.java" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/java/com/lynn/Application.java" @@ -1,10 +1,10 @@ package com.lynn; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; -@SpringBootApplication +@SpringCloudApplication @EnableEurekaServer public class Application { diff --git "a/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/resources/application.yml" "b/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/resources/application.yml" index 24c4ede..34535fc 100755 --- "a/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/resources/application.yml" +++ "b/\347\254\25410\350\257\276/springcloud/eurekaserver/src/main/resources/application.yml" @@ -1,17 +1,26 @@ server: port: 8761 spring: + application: + name: eurekaserver profiles: active: dev + cloud: + inetutils: + preferred-networks: 127.0.0.1 + client: + ip-address: 127.0.0.1 eureka: server: - enable-self-preservation: false + peer-node-read-timeout-ms: 3000 + enable-self-preservation: true instance: - preferIpAddress: true - hostname: ${spring.cloud.client.ipAddress} - instanceId: ${spring.cloud.client.ipAddress}:${server.port} + prefer-ip-address: false + instance-id: ${spring.cloud.client.ip-address}:${server.port} client: - registerWithEureka: false + registerWithEureka: true fetchRegistry: false + healthcheck: + enabled: true serviceUrl: - defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ \ No newline at end of file + defaultZone: http://127.0.0.1:8761/eureka/ \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/feign/pom.xml" "b/\347\254\25410\350\257\276/springcloud/feign/pom.xml" index 0cede34..ad8a4bc 100644 --- "a/\347\254\25410\350\257\276/springcloud/feign/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/feign/pom.xml" @@ -14,19 +14,23 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-netflix-eureka-client org.springframework.cloud - spring-cloud-starter-feign + spring-cloud-starter-openfeign org.springframework.cloud - spring-cloud-starter-hystrix + spring-cloud-starter-netflix-hystrix + + + org.springframework.boot + spring-boot-starter-web org.springframework.cloud - spring-cloud-starter-hystrix-dashboard + spring-cloud-starter-netflix-hystrix-dashboard org.springframework.boot diff --git "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiController.java" "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiController.java" index b004046..9879aeb 100644 --- "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiController.java" +++ "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiController.java" @@ -14,4 +14,4 @@ public class ApiController { public String index(){ return apiService.index(); } -} +} \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiService.java" "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiService.java" index ced2a74..b9ee1e8 100644 --- "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiService.java" +++ "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiService.java" @@ -1,6 +1,6 @@ package com.lynn.feign; -import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiServiceError.java" "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiServiceError.java" index bd22401..1f013a6 100644 --- "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiServiceError.java" +++ "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/ApiServiceError.java" @@ -9,4 +9,4 @@ public class ApiServiceError implements ApiService { public String index() { return "服务发生故障!"; } -} +} \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/Application.java" "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/Application.java" index bb7ab28..4bb9938 100644 --- "a/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/Application.java" +++ "b/\347\254\25410\350\257\276/springcloud/feign/src/main/java/com/lynn/feign/Application.java" @@ -1,22 +1,32 @@ package com.lynn.feign; +import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; -@SpringBootApplication -@EnableEurekaClient +@SpringCloudApplication @EnableFeignClients @EnableHystrixDashboard -@EnableCircuitBreaker public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } + @Bean + public ServletRegistrationBean getServlet(){ + HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); + ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet ); + registrationBean.setLoadOnStartup(1); + registrationBean.addUrlMappings("/hystrix.stream"); + registrationBean.setName("HystrixMetricsStreamServlet"); + return registrationBean; + } + + } \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/feign/src/main/resources/application.yml" "b/\347\254\25410\350\257\276/springcloud/feign/src/main/resources/application.yml" index 8ad1dfa..5c79b6c 100755 --- "a/\347\254\25410\350\257\276/springcloud/feign/src/main/resources/application.yml" +++ "b/\347\254\25410\350\257\276/springcloud/feign/src/main/resources/application.yml" @@ -7,6 +7,7 @@ server: spring: application: name: feign +#开启熔断器 feign: hystrix: enabled: true \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/pom.xml" "b/\347\254\25410\350\257\276/springcloud/gateway/pom.xml" index a9e9356..a03b45f 100755 --- "a/\347\254\25410\350\257\276/springcloud/gateway/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/gateway/pom.xml" @@ -14,11 +14,19 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-netflix-eureka-client org.springframework.cloud - spring-cloud-starter-zuul + spring-cloud-starter-gateway + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFallbackProvider.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFallbackProvider.java" deleted file mode 100755 index 8142ecb..0000000 --- "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFallbackProvider.java" +++ /dev/null @@ -1,64 +0,0 @@ -package com.lynn.gateway; - -import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.stereotype.Component; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * 错误拦截 - * - * @author liyi - * @create 2018-01-19 16:57 - **/ -@Component -public class ApiFallbackProvider implements ZuulFallbackProvider{ - - @Override - public String getRoute() { - return "eurekaclient"; - } - - @Override - public ClientHttpResponse fallbackResponse() { - return new ClientHttpResponse() { - @Override - public HttpStatus getStatusCode() throws IOException { - return HttpStatus.OK; - } - - @Override - public int getRawStatusCode() throws IOException { - return 200; - } - - @Override - public String getStatusText() throws IOException { - return "{code:0,message:\"服务器异常!\"}"; - } - - @Override - public void close() { - - } - - @Override - public InputStream getBody() throws IOException { - return new ByteArrayInputStream(getStatusText().getBytes()); - } - - @Override - public HttpHeaders getHeaders() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - return headers; - } - }; - } -} diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFilter.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFilter.java" deleted file mode 100755 index 744f806..0000000 --- "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiFilter.java" +++ /dev/null @@ -1,42 +0,0 @@ -package com.lynn.gateway; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; - -@Component -public class ApiFilter extends ZuulFilter { - - @Override - public String filterType() { - return "pre"; - } - - @Override - public int filterOrder() { - return 0; - } - - @Override - public boolean shouldFilter() { - return true; - } - - @Override - public Object run() { - //这里写校验代码 - RequestContext context = RequestContext.getCurrentContext(); - HttpServletRequest request = context.getRequest(); - String token = request.getParameter("token"); - if(!"12345".equals(token)){ - context.setSendZuulResponse(false); - context.setResponseStatusCode(401); - try { - context.getResponse().getWriter().write("token is invalid."); - }catch (Exception e){} - } - return null; - } -} diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiGlobalFilter.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiGlobalFilter.java" new file mode 100644 index 0000000..d9bf01b --- /dev/null +++ "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ApiGlobalFilter.java" @@ -0,0 +1,36 @@ +package com.lynn.gateway; + +import org.apache.commons.lang.StringUtils; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +@Component +public class ApiGlobalFilter implements GlobalFilter { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String token = exchange.getRequest().getQueryParams().getFirst("token"); + if (StringUtils.isBlank(token)) { + ServerHttpResponse response = exchange.getResponse(); + Map message = new HashMap<>(); + message.put("status", -1); + message.put("data", "鉴权失败"); + byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8); + DataBuffer buffer = response.bufferFactory().wrap(bits); + response.setStatusCode(HttpStatus.UNAUTHORIZED); + response.getHeaders().add("Content-Type", "text/json;charset=UTF-8"); + return response.writeWith(Mono.just(buffer)); + } + return chain.filter(exchange); + } +} diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/Application.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/Application.java" index b4e5562..bd9b4fe 100755 --- "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/Application.java" +++ "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/Application.java" @@ -1,14 +1,9 @@ package com.lynn.gateway; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; -import org.springframework.cloud.netflix.zuul.EnableZuulServer; +import org.springframework.cloud.client.SpringCloudApplication; -@SpringBootApplication -@EnableEurekaClient -@EnableZuulProxy +@SpringCloudApplication public class Application { public static void main(String[] args) { diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ErrorHandlerConfiguration.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ErrorHandlerConfiguration.java" new file mode 100644 index 0000000..7092d9e --- /dev/null +++ "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/ErrorHandlerConfiguration.java" @@ -0,0 +1,65 @@ +package com.lynn.gateway; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.web.ResourceProperties; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.reactive.error.ErrorAttributes; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.web.reactive.result.view.ViewResolver; + +import java.util.Collections; +import java.util.List; + +@SpringBootConfiguration +@EnableConfigurationProperties({ServerProperties.class, ResourceProperties.class}) +public class ErrorHandlerConfiguration { + + private final ServerProperties serverProperties; + + private final ApplicationContext applicationContext; + + private final ResourceProperties resourceProperties; + + private final List viewResolvers; + + private final ServerCodecConfigurer serverCodecConfigurer; + + public ErrorHandlerConfiguration(ServerProperties serverProperties, + ResourceProperties resourceProperties, + ObjectProvider> viewResolversProvider, + ServerCodecConfigurer serverCodecConfigurer, + ApplicationContext applicationContext) { + this.serverProperties = serverProperties; + this.applicationContext = applicationContext; + this.resourceProperties = resourceProperties; + this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList); + this.serverCodecConfigurer = serverCodecConfigurer; + } + + /** + * gateway启动时执行此方法,将JsonExceptionHandler注入到Spring容器中 + * 以便发生异常时执行自定义的JsonExceptionHandler + * @param errorAttributes + * @return + */ + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes) { + JsonExceptionHandler exceptionHandler = new JsonExceptionHandler( + errorAttributes, + this.resourceProperties, + this.serverProperties.getError(), + this.applicationContext); + exceptionHandler.setViewResolvers(this.viewResolvers); + exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters()); + exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders()); + return exceptionHandler; + } +} \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/JsonExceptionHandler.java" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/JsonExceptionHandler.java" new file mode 100644 index 0000000..9d946cd --- /dev/null +++ "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/java/com/lynn/gateway/JsonExceptionHandler.java" @@ -0,0 +1,91 @@ +package com.lynn.gateway; + +import org.springframework.boot.autoconfigure.web.ErrorProperties; +import org.springframework.boot.autoconfigure.web.ResourceProperties; +import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler; +import org.springframework.boot.web.reactive.error.ErrorAttributes; +import org.springframework.context.ApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.server.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 自定义异常处理 + * SpringBoot提供了默认的异常处理类,即图8-3演示效果,这显然不符合我们的预期 + * 因此需要重写此类,返回统一的Json格式 + */ +public class JsonExceptionHandler extends DefaultErrorWebExceptionHandler { + + public JsonExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties, + ErrorProperties errorProperties, ApplicationContext applicationContext) { + super(errorAttributes, resourceProperties, errorProperties, applicationContext); + } + + /** + * 获取异常属性 + */ + @Override + protected Map getErrorAttributes(ServerRequest request, boolean includeStackTrace) { + int code = 500; + Throwable error = super.getError(request); + if (error instanceof org.springframework.cloud.gateway.support.NotFoundException) { + code = 404; + } + return response(code, this.buildMessage(request, error)); + } + + /** + * 指定响应处理方法为JSON处理的方法 + * @param errorAttributes + */ + @Override + protected RouterFunction getRoutingFunction(ErrorAttributes errorAttributes) { + return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse); + } + + /** + * 根据code获取对应的HttpStatus + * @param errorAttributes + */ + @Override + protected HttpStatus getHttpStatus(Map errorAttributes) { + int statusCode = (int) errorAttributes.get("code"); + return HttpStatus.valueOf(statusCode); + } + + /** + * 构建异常信息 + * @param request + * @param ex + * @return + */ + private String buildMessage(ServerRequest request, Throwable ex) { + StringBuilder message = new StringBuilder("Failed to handle request ["); + message.append(request.methodName()); + message.append(" "); + message.append(request.uri()); + message.append("]"); + if (ex != null) { + message.append(": "); + message.append(ex.getMessage()); + } + return message.toString(); + } + + /** + * 构建返回的JSON数据格式 + * @param status 状态码 + * @param errorMessage 异常信息 + * @return + */ + public static Map response(int status, String errorMessage) { + Map map = new HashMap<>(); + map.put("code", status); + map.put("message", errorMessage); + map.put("data", null); + return map; + } + +} \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/resources/application.yml" "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/resources/application.yml" index 45062e8..b2f128e 100755 --- "a/\347\254\25410\350\257\276/springcloud/gateway/src/main/resources/application.yml" +++ "b/\347\254\25410\350\257\276/springcloud/gateway/src/main/resources/application.yml" @@ -1,14 +1,20 @@ -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ server: port: 8080 spring: application: name: gateway -zuul: - routes: - api: - path: /api/** - serviceId: eurekaclient + cloud: + gateway: + discovery: + locator: + enabled: true +logging: + level: + org.springframework.cloud.gateway: trace + org.springframework.http.server.reactive: debug + org.springframework.web.reactive: debug + reactor.ipc.netty: debug +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git "a/\347\254\25410\350\257\276/springcloud/pom.xml" "b/\347\254\25410\350\257\276/springcloud/pom.xml" index 1298563..dabf4a1 100755 --- "a/\347\254\25410\350\257\276/springcloud/pom.xml" +++ "b/\347\254\25410\350\257\276/springcloud/pom.xml" @@ -19,15 +19,21 @@ org.springframework.boot spring-boot-starter-parent - 1.5.9.RELEASE + 2.1.3.RELEASE + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + + org.springframework.cloud spring-cloud-dependencies - Dalston.SR5 + Greenwich.RELEASE pom import diff --git "a/\347\254\25411\350\257\276/springcloud/eurekaclient/pom.xml" "b/\347\254\25411\350\257\276/springcloud/eurekaclient/pom.xml" index 2dd7c45..41ed015 100755 --- "a/\347\254\25411\350\257\276/springcloud/eurekaclient/pom.xml" +++ "b/\347\254\25411\350\257\276/springcloud/eurekaclient/pom.xml" @@ -30,7 +30,7 @@ org.springframework.cloud - spring-cloud-starter-sleuth + spring-cloud-sleuth-zipkin org.springframework.cloud diff --git "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/config/MyBatisConfig2.java" "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/config/MyBatisConfig2.java" index a811b62..b8e92cf 100644 --- "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/config/MyBatisConfig2.java" +++ "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/config/MyBatisConfig2.java" @@ -44,7 +44,7 @@ public DataSource dataSource(DBConfig2 testConfig) throws SQLException { return xaDataSource; } - @Bean(name = "dqlSessionFactory2") + @Bean(name = "sqlSessionFactory2") public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); diff --git "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/lock/RedissonConnector.java" "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/lock/RedissonConnector.java" index d26a9c5..3d00c77 100644 --- "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/lock/RedissonConnector.java" +++ "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/lock/RedissonConnector.java" @@ -2,6 +2,8 @@ import org.redisson.Redisson; import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -11,10 +13,20 @@ */ @Component public class RedissonConnector { + + @Value("${spring.redis.host}") + private String host; + @Value("${spring.redis.port}") + private String port; +// @Value("${spring.redis.password}") +// private String password; + RedissonClient redisson; @PostConstruct public void init(){ - redisson = Redisson.create(); + Config config = new Config(); + config.useSingleServer().setAddress("redis://"+host+":"+port); +// redisson = Redisson.create(config); } public RedissonClient getClient(){ diff --git "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/service/UserService.java" "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/service/UserService.java" index 3ea4c84..a75b837 100644 --- "a/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/service/UserService.java" +++ "b/\347\254\25413\350\257\276/demo/src/main/java/com/lynn/demo/service/UserService.java" @@ -18,6 +18,10 @@ public class UserService { @Transactional public void addUser(User user)throws Exception{ userMapper1.addUser(user.getName(),user.getAge()); + String bb = null; + if(bb.equals("aa")){ + System.out.println("test"); + } userMapper2.addUser(user.getName(),user.getAge()); } } diff --git "a/\347\254\25413\350\257\276/demo/src/main/resources/application.yml" "b/\347\254\25413\350\257\276/demo/src/main/resources/application.yml" index a052566..374ba86 100644 --- "a/\347\254\25413\350\257\276/demo/src/main/resources/application.yml" +++ "b/\347\254\25413\350\257\276/demo/src/main/resources/application.yml" @@ -2,7 +2,7 @@ server: port: 8080 spring: redis: - host: localhost + host: 127.0.0.1 port: 6379 mysql: datasource: