diff --git a/springcloud/spring-cloud-stream消息队列/confsvr/pom.xml b/springcloud/spring-cloud-stream消息队列/confsvr/pom.xml new file mode 100644 index 0000000..5c8cec2 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/confsvr/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.fxb + demo + 0.0.1-SNAPSHOT + jar + + confsvr + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.4.RELEASE + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR5 + pom + import + + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR5 + + + + + org.springframework.cloud + spring-cloud-config-server + + + org.springframework.cloud + spring-cloud-starter-eureka + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/springcloud/spring-cloud-stream消息队列/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java b/springcloud/spring-cloud-stream消息队列/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java new file mode 100644 index 0000000..3c94900 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java @@ -0,0 +1,16 @@ +package com.fxb.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.config.server.EnableConfigServer; + +@SpringBootApplication +@EnableConfigServer +@EnableDiscoveryClient +public class ConfsvrApplication { + + public static void main(String[] args) { + SpringApplication.run(ConfsvrApplication.class, args); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/confsvr/src/main/resources/application.yml b/springcloud/spring-cloud-stream消息队列/confsvr/src/main/resources/application.yml new file mode 100644 index 0000000..528c81c --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/confsvr/src/main/resources/application.yml @@ -0,0 +1,29 @@ +server: + port: 8888 + +eureka: + instance: + #注册服务的IP,而不是服务器名 + prefer-ip-address: true + client: + #向eureka注册服务 + register-with-eureka: true + #拉取注册表的本地副本 + fetch-registry: true + service-url: + #Eureka服务的位置(如果有多个注册中心,使用,分隔) + defaultZone: http://localhost:8761/eureka/ + +spring: + profiles: + # 使用文件系统来存储配置信息,需要设置为native + active: native + application: + name: confsvr + cloud: + config: + server: + native: + # 使用文件来存放配置文件,为每个应用程序提供用逗号分隔的文件夹列表 + searchLocations: file:///D:/configFolder/licensingservice,file:///D:/configFolder/organizationservice + diff --git a/springcloud/spring-cloud-stream消息队列/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java b/springcloud/spring-cloud-stream消息队列/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java new file mode 100644 index 0000000..3096743 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java @@ -0,0 +1,16 @@ +package com.fxb.demo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ConfsvrApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/springcloud/spring-cloud-stream消息队列/eurekasvr/pom.xml b/springcloud/spring-cloud-stream消息队列/eurekasvr/pom.xml new file mode 100644 index 0000000..5337b2a --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/eurekasvr/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + com.fxb + eurekasvr + 0.0.1-SNAPSHOT + jar + + eurekasvr + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.4.RELEASE + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR5 + pom + import + + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR5 + + + + + org.springframework.cloud + spring-cloud-starter-eureka-server + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + diff --git a/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java new file mode 100644 index 0000000..0ee3302 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java @@ -0,0 +1,14 @@ +package com.fxb.eurekasvr; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class EurekasvrApplication { + + public static void main(String[] args) { + SpringApplication.run(EurekasvrApplication.class, args); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/resources/application.yml b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/resources/application.yml new file mode 100644 index 0000000..12cd213 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8761 + +eureka: + client: + #不注册自己 + register-with-eureka: false + #不在本地缓存注册表信息 + fetch-registry: false + server: + #接受请求前的等待实际,开发模式下不要开启 + #wait-time-in-ms-when-sync-empty: 5 diff --git a/springcloud/spring-cloud-stream消息队列/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java new file mode 100644 index 0000000..3d21ad6 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java @@ -0,0 +1,16 @@ +package com.fxb.eurekasvr; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class EurekasvrApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/pom.xml b/springcloud/spring-cloud-stream消息队列/licensingservice/pom.xml new file mode 100644 index 0000000..01857d5 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + com.fxb + licensingservice + 0.0.1-SNAPSHOT + jar + + licensingservice + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.4.RELEASE + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR5 + pom + import + + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR5 + + + + + org.springframework.cloud + spring-cloud-starter-eureka + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.cloud + spring-cloud-config-client + + + org.springframework.cloud + spring-cloud-starter-feign + + + org.springframework.cloud + spring-cloud-starter-hystrix + + + + com.netflix.hystrix + hystrix-javanica + 1.5.9 + + + + org.springframework.cloud + spring-cloud-stream + + + + org.springframework.cloud + spring-cloud-starter-stream-kafka + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java new file mode 100644 index 0000000..fd0fb83 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java @@ -0,0 +1,32 @@ +package com.fxb.licensingservice.Entity; + +import java.io.Serializable; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2018/11/22 19:52 + */ +public class Licensing implements Serializable { + private Organization organization; + private boolean isValid; + + public Organization getOrganization() { + return organization; + } + + public void setOrganization(Organization organization) { + this.organization = organization; + } + + public boolean isValid() { + return isValid; + } + + public void setValid(boolean valid) { + isValid = valid; + } + +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java new file mode 100644 index 0000000..357bfa3 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java @@ -0,0 +1,40 @@ +package com.fxb.licensingservice.Entity; + +import java.io.Serializable; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2018/11/22 19:30 + */ +public class Organization implements Serializable { + + private String id; + private String name; + + public Organization() { + } + + public Organization(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/OrganizationChange.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/OrganizationChange.java new file mode 100644 index 0000000..79af2a7 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/OrganizationChange.java @@ -0,0 +1,58 @@ +package com.fxb.licensingservice.Entity; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 17:07 + */ +public class OrganizationChange { + /** + * 动作:修改,删除等 + */ + private String action; + + + /** + * 组织id + */ + private String orgId; + + /** + * 关联id + */ + private String id; + + public OrganizationChange(String action, String orgId, String id) { + this.action = action; + this.orgId = orgId; + this.id = id; + } + + public OrganizationChange(){} + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/UserContext.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/UserContext.java new file mode 100644 index 0000000..b5e91c1 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/Entity/UserContext.java @@ -0,0 +1,17 @@ +package com.fxb.licensingservice.Entity; + +/** + * 类功能简述:用于存储传入http请求中获取的值 + * + * @author fanxb + * @date 2019/2/21 16:25 + */ +public class UserContext { + + public static final String ID_HEADER_KEY = "id"; + + /** + * 用户访问管理id + */ + public String id; +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java new file mode 100644 index 0000000..690b41a --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java @@ -0,0 +1,48 @@ +package com.fxb.licensingservice; + +import com.fxb.licensingservice.interceptors.UserContextInterceptor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; +import java.util.List; + +@SpringBootApplication +@EnableCircuitBreaker //告诉Spring Cloud将要使用Hystrix +@EnableDiscoveryClient +public class LicensingserviceApplication { + + private Logger logger = LoggerFactory.getLogger(LicensingserviceApplication.class); + + /** + * 使用带有Ribbon 功能的Spring RestTemplate + */ + @LoadBalanced + @Bean + @SuppressWarnings("unchecked") + public RestTemplate getRestTemplate(){ + RestTemplate restTemplate = new RestTemplate(); + //加上拦截器,发出请求前加入管理id Header + List interceptors = restTemplate.getInterceptors(); + if(interceptors==null){ + restTemplate.setInterceptors(Collections.singletonList(new UserContextInterceptor())); + }else{ + interceptors.add(new UserContextInterceptor()); + } + return restTemplate; + } + + + + + public static void main(String[] args) { + SpringApplication.run(LicensingserviceApplication.class, args); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/config/RedisConfig.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/config/RedisConfig.java new file mode 100644 index 0000000..947148b --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/config/RedisConfig.java @@ -0,0 +1,47 @@ +package com.fxb.licensingservice.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/20 17:07 + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + @Bean(name = "redisTemplate") + @SuppressWarnings("all") + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + serializer.setObjectMapper(mapper); + + // 设置RedisTemplate + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + RedisSerializer stringSerializer = new StringRedisSerializer(); + template.setKeySerializer(stringSerializer); + template.setValueSerializer(serializer); + template.setHashKeySerializer(stringSerializer); + template.setHashValueSerializer(serializer); + template.afterPropertiesSet(); + return template; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java new file mode 100644 index 0000000..ca9b6ce --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java @@ -0,0 +1,33 @@ +package com.fxb.licensingservice.controller; + +import com.fxb.licensingservice.Entity.Licensing; +import com.fxb.licensingservice.service.OrganizationByRibbonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2018/11/22 19:51 + */ +@RestController +public class LicensingController { + + private OrganizationByRibbonService ribbonService; + + @Autowired + public LicensingController(OrganizationByRibbonService ribbonService) { + this.ribbonService = ribbonService; + } + + @GetMapping("/licensingByRibbon/{orgId}") + public Licensing getLicensingByRibbon(@PathVariable("orgId") String orgId) throws Exception { + Licensing licensing = new Licensing(); + licensing.setOrganization(ribbonService.getOrganizationWithRibbon(orgId)); + return licensing; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomInput.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomInput.java new file mode 100644 index 0000000..ab08dd3 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomInput.java @@ -0,0 +1,17 @@ +package com.fxb.licensingservice.event; + +import org.springframework.cloud.stream.annotation.Input; +import org.springframework.messaging.SubscribableChannel; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/22 16:53 + */ +public interface CustomInput { + + @Input("customInput") + SubscribableChannel in(); +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomOutput.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomOutput.java new file mode 100644 index 0000000..e473506 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/CustomOutput.java @@ -0,0 +1,17 @@ +package com.fxb.licensingservice.event; + +import org.springframework.cloud.stream.annotation.Output; +import org.springframework.messaging.MessageChannel; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/22 16:53 + */ +public interface CustomOutput { + + @Output("customOutput") + MessageChannel out(); +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/OrgChange.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/OrgChange.java new file mode 100644 index 0000000..0a37204 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/event/OrgChange.java @@ -0,0 +1,29 @@ +package com.fxb.licensingservice.event; + +import com.fxb.licensingservice.Entity.OrganizationChange; +import com.fxb.licensingservice.util.RedisKeyUtils; +import com.fxb.licensingservice.util.RedisUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Sink; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/22 10:33 + */ +@EnableBinding(Sink.class) //使用Sink接口中定义的通道来监听传入消息 +public class OrgChange { + + private Logger logger = LoggerFactory.getLogger(OrgChange.class); + + @StreamListener(Sink.INPUT) + public void loggerSink(OrganizationChange change){ + logger.info("收到一个消息,组织id为:{},关联id为:{}",change.getOrgId(),change.getId()); + RedisUtils.del(RedisKeyUtils.getOrgCacheKey(change.getOrgId())); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/filters/UserContextFilter.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/filters/UserContextFilter.java new file mode 100644 index 0000000..899e54f --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/filters/UserContextFilter.java @@ -0,0 +1,51 @@ +package com.fxb.licensingservice.filters; + +import com.fxb.licensingservice.Entity.UserContext; +import com.fxb.licensingservice.util.UserContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 16:23 + */ +@Component +@WebFilter(urlPatterns = "/*", filterName="userContextFilter") +public class UserContextFilter implements Filter { + + private Logger logger = LoggerFactory.getLogger(UserContextHolder.class); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void destroy() { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + String id = request.getHeader(UserContext.ID_HEADER_KEY); + if (id == null || id.trim().length() == 0) { + UserContextHolder.remove(); + } else { + UserContext context = new UserContext(); + context.id = id; + UserContextHolder.setContext(context); + logger.info("当前入栈id:{}", id); + } + filterChain.doFilter(servletRequest,servletResponse); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/interceptors/UserContextInterceptor.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/interceptors/UserContextInterceptor.java new file mode 100644 index 0000000..9ad3325 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/interceptors/UserContextInterceptor.java @@ -0,0 +1,28 @@ +package com.fxb.licensingservice.interceptors; + +import com.fxb.licensingservice.Entity.UserContext; +import com.fxb.licensingservice.util.UserContextHolder; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +/** + * 类功能简述:用于发起实际http调用前在请求头中加入关联id + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 16:43 + */ +public class UserContextInterceptor implements ClientHttpRequestInterceptor { + + @Override + public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { + HttpHeaders headers = httpRequest.getHeaders(); + headers.add(UserContext.ID_HEADER_KEY,UserContextHolder.getContext().id); + return clientHttpRequestExecution.execute(httpRequest,bytes); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java new file mode 100644 index 0000000..debfd82 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java @@ -0,0 +1,70 @@ +package com.fxb.licensingservice.service; + +import com.fxb.licensingservice.Entity.Organization; +import com.fxb.licensingservice.util.RedisKeyUtils; +import com.fxb.licensingservice.util.RedisUtils; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2018/11/23 15:36 + */ +@Component +public class OrganizationByRibbonService { + + private RestTemplate restTemplate; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + public OrganizationByRibbonService(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @HystrixCommand(commandProperties = { + @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") + }, fallbackMethod = "getOrganizationWithRibbonBackup", + threadPoolKey = "licenseByOrgThreadPool", + threadPoolProperties = { + @HystrixProperty(name = "coreSize", value = "30"), + @HystrixProperty(name = "maxQueueSize", value = "10") + }) + public Organization getOrganizationWithRibbon(String id) { + String key = RedisKeyUtils.getOrgCacheKey(id); + //先从redis缓存取数据 + Object res = RedisUtils.get(key); + if (res == null) { + logger.info("当前数据无缓存:{}", id); + try{ + + ResponseEntity responseEntity = restTemplate.exchange("http://organizationservice/organization/{id}", + HttpMethod.GET, null, Organization.class, id); + res = responseEntity.getBody(); + RedisUtils.setObj(key, res); + }catch (Exception e){ + e.printStackTrace(); + } + } else { + logger.info("当前数据为缓存数据:{}", id); + } + return (Organization) res; + } + + public Organization getOrganizationWithRibbonBackup(String id) { + Organization organization = new Organization(); + organization.setId("0"); + organization.setName("组织服务调用失败"); + return organization; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisKeyUtils.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisKeyUtils.java new file mode 100644 index 0000000..de3f53e --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisKeyUtils.java @@ -0,0 +1,17 @@ +package com.fxb.licensingservice.util; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/22 10:36 + */ +public class RedisKeyUtils { + + private static final String ORG_CACHE_PREFIX = "orgCache_"; + + public static String getOrgCacheKey(String orgId){ + return ORG_CACHE_PREFIX+orgId; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisUtils.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisUtils.java new file mode 100644 index 0000000..62d7ec5 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/RedisUtils.java @@ -0,0 +1,74 @@ +package com.fxb.licensingservice.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.concurrent.TimeUnit; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 15:05 + */ +@Component +@SuppressWarnings("all") +public class RedisUtils { + + public static RedisTemplate redisTemplate; + + @Autowired + public void setRedisTemplate(RedisTemplate redisTemplate) { + RedisUtils.redisTemplate = redisTemplate; + } + + public static boolean setObj(String key,Object value){ + return setObj(key,value,0); + } + + /** + * Description: + * + * @author fanxb + * @date 2019/2/21 15:21 + * @param key 键 + * @param value 值 + * @param time 过期时间,单位ms + * @return boolean 是否成功 + */ + public static boolean setObj(String key,Object value,long time){ + try{ + if(time<=0){ + redisTemplate.opsForValue().set(key,value); + }else{ + redisTemplate.opsForValue().set(key,value,time,TimeUnit.MILLISECONDS); + } + return true; + }catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + public static Object get(String key){ + if(key==null){ + return null; + } + try{ + Object obj = redisTemplate.opsForValue().get(key); + return obj; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + public static void del(String... key){ + if(key!=null && key.length>0){ + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/UserContextHolder.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/UserContextHolder.java new file mode 100644 index 0000000..84f1e59 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/java/com/fxb/licensingservice/util/UserContextHolder.java @@ -0,0 +1,33 @@ +package com.fxb.licensingservice.util; + +import com.fxb.licensingservice.Entity.UserContext; +import org.springframework.util.Assert; + +/** + * 类功能简述:存储每个传入请求id到ThreadLocal中 + * + * @author fanxb + * @date 2019/2/21 16:29 + */ +public class UserContextHolder { + private static final ThreadLocal USER_CONTEXT_HOLDER=new ThreadLocal<>(); + + public static UserContext getContext(){ + UserContext context = USER_CONTEXT_HOLDER.get(); + if(context==null){ + context = new UserContext(); + USER_CONTEXT_HOLDER.set(context); + } + return context; + } + + public static void setContext(UserContext context){ + Assert.notNull(context,"context不允许为空"); + USER_CONTEXT_HOLDER.set(context); + } + + + public static void remove(){ + USER_CONTEXT_HOLDER.remove(); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/resources/bootstrap.yml b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..9a13827 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/main/resources/bootstrap.yml @@ -0,0 +1,43 @@ +spring: + application: + #指定名称,以便spring cloud config客户端知道查找哪个配置 + name: licensingservice + profiles: + #指定环境 + active: dev + redis: + database: 0 + host: 192.168.226.5 + port: 6379 + password: + timeout: 3000 + pool: + max-active: 10 + max-wait: -1 + max-idle: 10 + min-idle: 0 + cloud: + config: + enabled: true + stream: + bindings: + input: + destination: orgChangeTopic + content-type: application/json + # 定义将要消费消息的消费者组的名称 + # 可能多个服务监听同一个消息队列。如果定义了消费者组,那么同组中只要有一个消费了消息,剩余的不会再次消费该消息,保证只有消息的 + # 一个副本会被该组的某个实例所消费 + group: licensingGroup + kafka: + binder: + zk-nodes: 192.168.226.5:2181 + brokers: 192.168.226.5:9092 +eureka: + instance: + prefer-ip-address: true + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ + diff --git a/springcloud/spring-cloud-stream消息队列/licensingservice/src/test/java/com/fxb/licensingservice/LicensingserviceApplicationTests.java b/springcloud/spring-cloud-stream消息队列/licensingservice/src/test/java/com/fxb/licensingservice/LicensingserviceApplicationTests.java new file mode 100644 index 0000000..d29b4bf --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/licensingservice/src/test/java/com/fxb/licensingservice/LicensingserviceApplicationTests.java @@ -0,0 +1,16 @@ +package com.fxb.licensingservice; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class LicensingserviceApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/pom.xml b/springcloud/spring-cloud-stream消息队列/organizationservice/pom.xml new file mode 100644 index 0000000..7957410 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + com.fxb + organizationservice + 0.0.1-SNAPSHOT + jar + + organizationservice + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.4.RELEASE + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR5 + pom + import + + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR5 + + + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.cloud + spring-cloud-config-client + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.cloud + spring-cloud-stream + + + + org.springframework.cloud + spring-cloud-starter-stream-kafka + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/OrganizationserviceApplication.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/OrganizationserviceApplication.java new file mode 100644 index 0000000..8da4995 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/OrganizationserviceApplication.java @@ -0,0 +1,14 @@ +package com.fxb.organizationservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class OrganizationserviceApplication { + + public static void main(String[] args) { + SpringApplication.run(OrganizationserviceApplication.class, args); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/controller/OrganizationController.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/controller/OrganizationController.java new file mode 100644 index 0000000..b60919a --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/controller/OrganizationController.java @@ -0,0 +1,43 @@ +package com.fxb.organizationservice.controller; + +import com.fxb.organizationservice.events.SimpleSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2018/11/22 18:23 + */ +@RestController +public class OrganizationController { + + @Autowired + private SimpleSource simpleSource; + + private Logger logger = LoggerFactory.getLogger(OrganizationController.class); + + @GetMapping(value = "/organization/{orgId}") + public Object getOrganizationInfo(@PathVariable("orgId") String orgId) throws Exception { + Map data = new HashMap<>(2); + data.put("id", orgId); + data.put("name", orgId + "公司"); + return data; + } + + @DeleteMapping(value = "/organization/{orgId}") + public void deleteOne(@PathVariable("orgId") String id) { + logger.debug("删除了组织:{}", id); + simpleSource.publishOrChange("delete", id); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/OrganizationChange.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/OrganizationChange.java new file mode 100644 index 0000000..d446dca --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/OrganizationChange.java @@ -0,0 +1,56 @@ +package com.fxb.organizationservice.entity; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 17:07 + */ +public class OrganizationChange { + /** + * 动作:修改,删除等 + */ + private String action; + + + /** + * 组织id + */ + private String orgId; + + /** + * 关联id + */ + private String id; + + public OrganizationChange(String action, String orgId,String id) { + this.action = action; + this.orgId = orgId; + this.id = id; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/UserContext.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/UserContext.java new file mode 100644 index 0000000..18d8f89 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/entity/UserContext.java @@ -0,0 +1,17 @@ +package com.fxb.organizationservice.entity; + +/** + * 类功能简述:用于存储传入http请求中获取的值 + * + * @author fanxb + * @date 2019/2/21 16:25 + */ +public class UserContext { + + public static final String ID_HEADER_KEY = "id"; + + /** + * 用户访问管理id + */ + public String id; +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/events/SimpleSource.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/events/SimpleSource.java new file mode 100644 index 0000000..7cf2af6 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/events/SimpleSource.java @@ -0,0 +1,39 @@ +package com.fxb.organizationservice.events; + +import com.fxb.organizationservice.controller.OrganizationController; +import com.fxb.organizationservice.entity.OrganizationChange; +import com.fxb.organizationservice.utils.UserContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 16:09 + */ + +@EnableBinding(Source.class) +public class SimpleSource { + private Logger logger = LoggerFactory.getLogger(SimpleSource.class); + + private Source source; + + @Autowired + public SimpleSource(Source source) { + this.source = source; + } + + public void publishOrChange(String action, String orgId) { + logger.info("在请求:{}中,发送kafka消息:{} for Organization Id:{}", UserContextHolder.getContext().id, action, orgId); + OrganizationChange change = new OrganizationChange(action, orgId, UserContextHolder.getContext().id); + source.output().send(MessageBuilder.withPayload(change).build()); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/filters/UserContextFilter.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/filters/UserContextFilter.java new file mode 100644 index 0000000..5984d8c --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/filters/UserContextFilter.java @@ -0,0 +1,51 @@ +package com.fxb.organizationservice.filters; + +import com.fxb.organizationservice.entity.UserContext; +import com.fxb.organizationservice.utils.UserContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/2/21 16:23 + */ +@Component +@WebFilter(urlPatterns = "/*", filterName="userContextFilter") +public class UserContextFilter implements Filter { + + private Logger logger = LoggerFactory.getLogger(UserContextHolder.class); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void destroy() { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + String id = request.getHeader(UserContext.ID_HEADER_KEY); + if (id == null || id.trim().length() == 0) { + UserContextHolder.remove(); + } else { + UserContext context = new UserContext(); + context.id = id; + UserContextHolder.setContext(context); + logger.info("当前入栈id:{}", id); + } + filterChain.doFilter(servletRequest,servletResponse); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/utils/UserContextHolder.java b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/utils/UserContextHolder.java new file mode 100644 index 0000000..82eeeb2 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/java/com/fxb/organizationservice/utils/UserContextHolder.java @@ -0,0 +1,33 @@ +package com.fxb.organizationservice.utils; + +import com.fxb.organizationservice.entity.UserContext; +import org.springframework.util.Assert; + +/** + * 类功能简述:存储每个传入请求id到ThreadLocal中 + * + * @author fanxb + * @date 2019/2/21 16:29 + */ +public class UserContextHolder { + private static final ThreadLocal USER_CONTEXT_HOLDER=new ThreadLocal<>(); + + public static UserContext getContext(){ + UserContext context = USER_CONTEXT_HOLDER.get(); + if(context==null){ + context = new UserContext(); + USER_CONTEXT_HOLDER.set(context); + } + return context; + } + + public static void setContext(UserContext context){ + Assert.notNull(context,"context不允许为空"); + USER_CONTEXT_HOLDER.set(context); + } + + + public static void remove(){ + USER_CONTEXT_HOLDER.remove(); + } +} diff --git a/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/resources/bootstrap.yml b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..095feca --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/organizationservice/src/main/resources/bootstrap.yml @@ -0,0 +1,27 @@ +spring: + application: + #指定名称,以便spring cloud config客户端知道查找哪个配置 + name: organizationservice + profiles: + #指定环境 + active: dev + cloud: + config: + enabled: true + stream: + bindings: + output: + destination: orgChangeTopic + content-type: application/json + kafka: + binder: + zk-nodes: 192.168.226.5:2181 + brokers: 192.168.226.5:9092 +eureka: + instance: + prefer-ip-address: true + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/pom.xml b/springcloud/spring-cloud-stream消息队列/zuul_svr/pom.xml new file mode 100644 index 0000000..33f5807 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 1.4.4.RELEASE + + + com.fxb + zuul_svr + 0.0.1-SNAPSHOT + zuul_svr + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR5 + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.cloud + spring-cloud-starter-eureka + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/ZuulSvrApplication.java b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/ZuulSvrApplication.java new file mode 100644 index 0000000..677e89f --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/ZuulSvrApplication.java @@ -0,0 +1,18 @@ +package com.fxb.zuul_svr; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; + +@SpringBootApplication +@EnableZuulProxy +@EnableDiscoveryClient +public class ZuulSvrApplication { + + public static void main(String[] args) { + SpringApplication.run(ZuulSvrApplication.class, args); + } + +} + diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/IdFilter.java b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/IdFilter.java new file mode 100644 index 0000000..2b649ae --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/IdFilter.java @@ -0,0 +1,66 @@ +package com.fxb.zuul_svr.filter; + +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/1/8 18:48 + */ +@Component +public class IdFilter extends ZuulFilter { + + private static final Logger LOGGER = LoggerFactory.getLogger(IdFilter.class); + + /** + * 返回过滤器类型 ;pre:前置过滤器。post:后置过滤器。routing:路由过滤器。error:错误过滤器 + */ + @Override + public String filterType() { + return "pre"; + } + + /** + * 过滤器执行顺序 + */ + @Override + public int filterOrder() { + return 1; + } + + /** + * 是否启动此过滤器 + */ + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run() { + RequestContext ctx = RequestContext.getCurrentContext(); + String id = ctx.getRequest().getHeader("id"); + //如果request找不到,再到zuul的方法中找id.request不允许直接修改response中的header, + // 所以为了让后续的过滤器能够获取到id才有下面的语法 + if(id==null){ + id = ctx.getZuulRequestHeaders().get("id"); + } + + if (id == null) { + id = UUID.randomUUID().toString(); + LOGGER.info("{} 无id,生成id:{}",ctx.getRequest().getRequestURI(), id); + ctx.addZuulRequestHeader("id", id); + } else { + LOGGER.info("{}存在id:{}", ctx.getRequest().getRequestURI(), id); + } + return null; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/ResponseFilter.java b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/ResponseFilter.java new file mode 100644 index 0000000..61946e8 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/ResponseFilter.java @@ -0,0 +1,64 @@ +package com.fxb.zuul_svr.filter; + +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/1/8 18:48 + */ +@Component +public class ResponseFilter extends ZuulFilter { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResponseFilter.class); + + /** + * 返回过滤器类型 ;pre:前置过滤器。post:后置过滤器。routing:路由过滤器。error:错误过滤器 + */ + @Override + public String filterType() { + return "post"; + } + + /** + * 过滤器执行顺序 + */ + @Override + public int filterOrder() { + return 1; + } + + /** + * 是否启动此过滤器 + */ + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run(){ + RequestContext ctx = RequestContext.getCurrentContext(); + String id = ctx.getZuulRequestHeaders().get("id"); + ctx.getResponse().addHeader("id", id); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(ctx.getResponseDataStream())); + String response = reader.readLine(); + LOGGER.info("响应为:{}", response); + //写到输出流中,本来可以由zuul框架来操作,但是我们已经读取了输入流,zuul读不到数据了,所以要手动写响应到response + ctx.getResponse().setHeader("Content-Type","application/json;charset=utf-8"); + ctx.getResponse().getWriter().write(response); + } catch (Exception e) { + } + return null; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/RouteFilter.java b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/RouteFilter.java new file mode 100644 index 0000000..2d8fea6 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/java/com/fxb/zuul_svr/filter/RouteFilter.java @@ -0,0 +1,56 @@ +package com.fxb.zuul_svr.filter; + +import com.netflix.zuul.ZuulFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/1/8 18:48 + */ +@Component +public class RouteFilter extends ZuulFilter { + + private static final Logger LOGGER = LoggerFactory.getLogger(RouteFilter.class); + + /** + * 返回过滤器类型 ;pre:前置过滤器。post:后置过滤器。routing:路由过滤器。error:错误过滤器 + */ + @Override + public String filterType() { + return "routing"; + } + + /** + * 过滤器执行顺序 + */ + @Override + public int filterOrder() { + return 1; + } + + /** + * 是否启动此过滤器 + */ + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run(){ + /** + * 下面只写出实现思路,真的完全实现下面的功能,代码量较大,可以参考spring 微服务实战中的实现点击跳转 + * + * 1.获取当前路径 + * 2.判断是否需要进行特殊路由 + * 3.如需要进行特殊路由,在此发起http请求 + * 3.将响应写到response返回给调用者 + */ + return null; + } +} diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/resources/application.yml b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/resources/application.yml new file mode 100644 index 0000000..e438159 --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/main/resources/application.yml @@ -0,0 +1,30 @@ +spring: + application: + name: zuulservice +#服务发现配置 +eureka: + instance: + prefer-ip-address: true + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ +server: + port: 5555 + +#zuul配置,自定义服务路径 +zuul: + routes: + #用于内部识别关键字 + organizationservice: /org/** + # 使用","分隔,“*”表示全部忽略 + ignored-services: organizationservice + prefix: /apis + + +ribbon: + readTimeOut: false + eureka: + #禁用Eureka支持 + enabled: true diff --git a/springcloud/spring-cloud-stream消息队列/zuul_svr/src/test/java/com/fxb/zuul_svr/ZuulSvrApplicationTests.java b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/test/java/com/fxb/zuul_svr/ZuulSvrApplicationTests.java new file mode 100644 index 0000000..97920ac --- /dev/null +++ b/springcloud/spring-cloud-stream消息队列/zuul_svr/src/test/java/com/fxb/zuul_svr/ZuulSvrApplicationTests.java @@ -0,0 +1,17 @@ +package com.fxb.zuul_svr; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ZuulSvrApplicationTests { + + @Test + public void contextLoads() { + } + +} +