一、父工程
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wuxi</groupId> <artifactId>scloud</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <modules> <module>EurekaServer</module> <module>EurekaClient</module> <module>EurekaClientA</module> <module>EurekaClientB</module> <module>EurekaConfig</module> </modules> <dependencyManagement> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.RELEASE</version> <type>pom</type> <scope>runtime</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-bus --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> <version>2.2.3.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-stream-binder-rabbit --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> <version>3.0.8.RELEASE</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.wuxi</groupId> <artifactId>PublicClass</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.9</source> <target>1.9</target> </configuration> </plugin> </plugins> </build> </project>
二、PublicClass
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wuxi</groupId> <artifactId>PublicClass</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.9</source> <target>1.9</target> </configuration> </plugin> </plugins> </build> </project>
3、Msg.class
package com.wuxi.vo; import java.util.HashMap; import java.util.Map; public class Msg { //状态吗 200-成功 400-失败 private int code; //提示信息 private String msg; //用户要返回给游览器的数据 private Map<String, Object> extend = new HashMap<String, Object>(); public static Msg success() { Msg result = new Msg(); result.setCode(200); result.setMsg("处理成功!"); return result; } public static Msg fail() { Msg result = new Msg(); result.setCode(400); result.setMsg("处理失败!"); return result; } //链式操作返回信息 public Msg add(String key, Object value) { this.getExtend().put(key, value); return this; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Map<String, Object> getExtend() { return extend; } public void setExtend(Map<String, Object> extend) { this.extend = extend; } }
三、EurekaServer
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaServer</artifactId> <parent> <artifactId>scloud</artifactId> <groupId>com.wuxi</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
3、application.yml
server: port: 8081 spring: application: name: EurekaServer eureka: client: register-with-eureka: false #Eureka服务本身无需注册 fetch-registry: false #Eureka服务本身无需获取注册信息 service-url: defaultZone: http://127.0.0.1:${server.port}/eureka/
4、启动类
package com.wuxi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class MyEurekaServer { public static void main(String[] args) { SpringApplication.run(MyEurekaServer.class); } }
四、EurekaConfig
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaConfig</artifactId> <parent> <artifactId>scloud</artifactId> <groupId>com.wuxi</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> </dependencies> </project>
3、application.yml
server: port: 8085 spring: application: name: EurekaConfig cloud: config: server: git: uri: https://gitee.com/YiSiYiNian/cloudconfig.git #git仓库地址 rabbitmq: host: 127.0.0.1 management: #暴露触发消息总线的地址 endpoints: web: exposure: include: bus-refresh
4、启动类
package com.wuxi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class); } }
五、EurekaClient
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaClient</artifactId> <parent> <artifactId>scloud</artifactId> <groupId>com.wuxi</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
3、bootstrap.yml
spring: cloud: config: name: application #文件名-前部分 profile: zuul #文件名-后部分 label: master #分支 uri: http://127.0.0.1:8085 #配置中心地址
4、启动类
package com.wuxi; 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; @SpringBootApplication @EnableEurekaClient @EnableZuulProxy public class MyEurekaClient { public static void main(String[] args) { SpringApplication.run(MyEurekaClient.class); } }
5、过滤器
package com.wuxi.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component @RefreshScope public class MyEurekaClientFilter extends ZuulFilter { /** * 在请求前pre或者后post执行 * * @return */ @Override public String filterType() { return "pre"; } /** * 多个过滤器的执行顺序,数字越小,表示越先执行 * * @return */ @Override public int filterOrder() { return 0; } /** * 当前过滤器是否开启true表示开启 * * @return */ @Override public boolean shouldFilter() { return true; } @Value("${person.name}") private String personName; /** * 过滤器内执行的操作 return任何object的值都表示继续执行 * RequestContext.getCurrentContext().setSendZuulResponse(false)表示不再继续执行 * * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { System.out.println("********"); System.out.println(personName); System.out.println("********"); RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); String header = request.getHeader("token"); if (header != null && !"".equals(header)) { //Authorization、Cookie、Set-Cookie不会转发 requestContext.addZuulRequestHeader("token", header); } return null; } }
六、EurekaClientA
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaClientA</artifactId> <parent> <artifactId>scloud</artifactId> <groupId>com.wuxi</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
3、application.yml
server: port: 8083 spring: application: name: EurekaClientA eureka: client: service-url: defaultZone: http://127.0.0.1:8081/eureka/ instance: prefer-ip-address: true #跨域
4、启动类
package com.wuxi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class MyEurekaClientA { public static void main(String[] args) { SpringApplication.run(MyEurekaClientA.class); } }
5、controller
package com.wuxi.controller; import com.wuxi.vo.Msg; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/a") public class AController { @RequestMapping(value = "/amethod/{id}") public Msg ametohd(@PathVariable("id") Integer id, HttpServletRequest req) { System.out.println(req.getHeader("token")); return Msg.success().add("id", id); } }
七、EurekaClientB
1、项目结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaClientB</artifactId> <parent> <artifactId>scloud</artifactId> <groupId>com.wuxi</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
3、application.yml
server: port: 8084 spring: application: name: EurekaClientB eureka: client: service-url: defaultZone: http://127.0.0.1:8081/eureka/ instance: prefer-ip-address: true #跨域 feign: hystrix: enabled: true
4、启动类
package com.wuxi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient @EnableFeignClients public class MyEurekaClientB { public static void main(String[] args) { SpringApplication.run(MyEurekaClientB.class); } }
5、feign接口
package com.wuxi.feign; import com.wuxi.feign.impl.AFeignImpl; import com.wuxi.vo.Msg; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient(value = "EurekaClientA", fallback = AFeignImpl.class) public interface AFeign { @RequestMapping(value = "/a/amethod/{id}") Msg ametohd(@PathVariable("id") Integer id); }
6、feign接口实现类
package com.wuxi.feign.impl; import com.wuxi.feign.AFeign; import com.wuxi.vo.Msg; import org.springframework.stereotype.Component; @Component public class AFeignImpl implements AFeign { @Override public Msg ametohd(Integer id) { return Msg.fail().add("branch", "熔断器触发"); } }
7、controller
package com.wuxi.controller; import com.wuxi.feign.AFeign; import com.wuxi.vo.Msg; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/b") public class BController { @Autowired private AFeign aFeign; @RequestMapping("/bmethod/{id}") public Msg bmethod(@PathVariable("id") Integer id) { return aFeign.ametohd(id); } }