├── .gitignore ├── HELP.md ├── README.md ├── config-service ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── jincou │ │ └── config │ │ └── service │ │ └── ConfigserviceApplication.java │ └── resources │ └── application.yml ├── eureka ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── jincou │ │ └── eureka │ │ └── EurekaserverApplication.java │ └── resources │ └── application.yml ├── pom.xml ├── service-order ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── jincou │ │ └── service │ │ └── order │ │ ├── OrderApplication.java │ │ ├── client │ │ └── ProduceClient.java │ │ ├── controller │ │ └── OrderController.java │ │ ├── fallbcak │ │ └── ProduceClientFallback.java │ │ ├── model │ │ └── ProduceOrder.java │ │ ├── service │ │ ├── ProduceOrderService.java │ │ └── impl │ │ │ └── ProduceOrderServiceImpl.java │ │ └── untils │ │ └── JsonUtils.java │ └── resources │ └── application.yml ├── service-produce ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── jincou │ │ └── service │ │ └── produce │ │ ├── ProduceApplication.java │ │ ├── controller │ │ ├── ConfigController.java │ │ └── ProduceController.java │ │ ├── model │ │ └── Produce.java │ │ └── service │ │ ├── ProduceService.java │ │ └── impl │ │ └── ProduceServiceImpl.java │ └── resources │ └── bootstrap.yml └── zuul-service ├── pom.xml └── src └── main ├── java └── com │ └── jincou │ └── zuul │ └── service │ └── ZuulServiceApplication.java └── resources └── application.yml /.gitignore: -------------------------------------------------------------------------------- 1 | /**/.DS_Store 2 | /logs/ 3 | /dubbo/ 4 | /**/*.iml 5 | /**/test/**/*.java 6 | 7 | target/ 8 | data/ 9 | !.mvn/wrapper/maven-wrapper.jar 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | 19 | ### IntelliJ IDEA ### 20 | .idea 21 | *.iws 22 | *.iml 23 | *.ipr 24 | 25 | ### NetBeans ### 26 | nbproject/private/ 27 | build/ 28 | nbbuild/ 29 | dist/ 30 | nbdist/ 31 | 32 | 33 | .nb-gradle/ 34 | .settings 35 | .classpath 36 | .project 37 | .springBeans 38 | mvnw 39 | mvnw.cmd 40 | .mvn 41 | /bin/ 42 | 43 | 44 | .flattened-pom.xml -------------------------------------------------------------------------------- /HELP.md: -------------------------------------------------------------------------------- 1 | # Getting Started 2 | 3 | ### Reference Documentation 4 | For further reference, please consider the following sections: 5 | 6 | * [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SpringCloud学习项目 2 | 3 | 有关该SpringCloud前面写了几篇博客作为该项目的详细说明。 4 | 5 | 1、[SpringCloud(2)---SpringCloud入门篇](https://www.cnblogs.com/qdhxhz/p/9357357.html) 6 | 7 | 2、[SpringCloud(3)---Eureka服务注册与发现](https://www.cnblogs.com/qdhxhz/p/9357502.html) 8 | 9 | 3、[SpringCloud(4)---Ribbon服务调用,源码分析](https://www.cnblogs.com/qdhxhz/p/9568481.html) 10 | 11 | 4、[SpringCloud(5)---Feign服务调用](https://www.cnblogs.com/qdhxhz/p/9571600.html) 12 | 13 | 5、[SpringCloud(6)---熔断降级理解、Hystrix实战](https://www.cnblogs.com/qdhxhz/p/9581440.html) 14 | 15 | 6、[SpringCloud(7)---网关概念、Zuul项目搭建](https://www.cnblogs.com/qdhxhz/p/9594521.html) 16 | 17 | 7、[SpringCloud(8)---zuul权限校验、接口限流](https://www.cnblogs.com/qdhxhz/p/9601170.html) 18 | 19 | 8、[SpringCloud(9)---mysql实现配置中心](https://www.cnblogs.com/qdhxhz/p/9624386.html) 20 | 21 | 22 | 23 | ## 一、项目概述 24 | 25 | #### 1、技术架构 26 | 27 | 项目总体技术选型 28 | 29 | ``` 30 | SpringBoot2.0.4 + Maven3.5.4 +spring-cloud(Finchley.RELEASE)+ mysql + Redis3.5.4 + lombok(插件) 31 | ``` 32 | 33 | #### 2、项目整体结构 34 | 35 | ```makefile 36 | eureka # 注册中心 37 | config-service # 配置中心服务 38 | zuul-service # 网关服务 39 | service-produce # 商品服务 40 | service-order # 订单服务 41 | ``` 42 | 43 | 项目的启动顺序 最好也安装上面的顺序启动。 44 | 45 | #### 3、测试 46 | 47 | 输入:**localhost:7001** 如果上面服务都出现那恭喜你 启动成功! 48 | 49 | ![](https://img2018.cnblogs.com/blog/1090617/201907/1090617-20190712190945077-771945780.png) 50 | 51 |
52 | 53 | -------------------------------------------------------------------------------- /config-service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | spring-cloud-study 7 | com.jincou 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | config-service 13 | 14 | 15 | 16 | 17 | org.springframework.cloud 18 | spring-cloud-starter-netflix-eureka-client 19 | 20 | 21 | 22 | 23 | org.springframework.cloud 24 | spring-cloud-config-server 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-jdbc 31 | 32 | 33 | mysql 34 | mysql-connector-java 35 | 5.1.21 36 | 37 | 38 | -------------------------------------------------------------------------------- /config-service/src/main/java/com/jincou/config/service/ConfigserviceApplication.java: -------------------------------------------------------------------------------- 1 | package com.jincou.config.service; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.config.server.EnableConfigServer; 6 | 7 | /** 8 | * @ClassName: ConfigserviceApplication 9 | * @Description: 配置中心 添加注解@EnableConfigServer 10 | * @author xub 11 | * @date 2019/7/12 下午3:39 12 | */ 13 | @SpringBootApplication 14 | @EnableConfigServer 15 | public class ConfigserviceApplication { 16 | 17 | public static void main(String[] args) { 18 | SpringApplication.run(ConfigserviceApplication.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /config-service/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | #服务名称 2 | server: 3 | port: 5001 4 | 5 | #连接配置信息 6 | spring: 7 | application: 8 | name: config-server-jdbc 9 | profiles: 10 | active: jdbc 11 | cloud: 12 | config: 13 | server: 14 | default-label: dev 15 | jdbc: 16 | sql: SELECT akey , avalue FROM config_server where APPLICATION=? and APROFILE=? and LABEL=? 17 | ##################################################################################################### 18 | # mysql 属性配置 19 | datasource: 20 | driver-class-name: com.mysql.jdbc.Driver 21 | url: jdbc:mysql://127.0.0.1:3306/config 22 | username: root 23 | password: root 24 | ##################################################################################################### 25 | 26 | 27 | #指定注册中心地址 28 | eureka: 29 | client: 30 | serviceUrl: 31 | defaultZone: http://localhost:7001/eureka/ 32 | 33 | -------------------------------------------------------------------------------- /eureka/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | spring-cloud-study 7 | com.jincou 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | eureka 13 | 14 | 15 | 16 | 17 | org.springframework.cloud 18 | spring-cloud-starter-netflix-eureka-server 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /eureka/src/main/java/com/jincou/eureka/EurekaserverApplication.java: -------------------------------------------------------------------------------- 1 | package com.jincou.eureka; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 | 7 | 8 | /** 9 | * @Description: 注册中心 10 | * 11 | * @author xub 12 | * @date 2019/7/12 下午12:21 13 | */ 14 | @SpringBootApplication 15 | @EnableEurekaServer 16 | public class EurekaserverApplication { 17 | 18 | public static void main(String[] args) { 19 | SpringApplication.run(EurekaserverApplication.class, args); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /eureka/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 7001 3 | 4 | eureka: 5 | instance: 6 | hostname: localhost 7 | client: 8 | #声明自己是个服务端 9 | registerWithEureka: false #false表示不向注册中心注册自己 10 | fetchRegistry: false #false表示自己就是注册中心,职责是维护实例,不参加检索 11 | serviceUrl: #设置eureka server的交互地址,即对外暴露的地址 12 | defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 13 | 14 | 15 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | pom 6 | 7 | eureka 8 | service-produce 9 | service-order 10 | config-service 11 | zuul-service 12 | 13 | 14 | org.springframework.boot 15 | spring-boot-starter-parent 16 | 2.0.4.RELEASE 17 | 18 | 19 | com.jincou 20 | spring-cloud-study 21 | 0.0.1-SNAPSHOT 22 | spring-cloud-study 23 | Demo project for Spring Boot 24 | 25 | 26 | UTF-8 27 | UTF-8 28 | 1.8 29 | Finchley.RELEASE 30 | 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter 36 | 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-web 41 | 42 | 43 | 44 | 45 | org.projectlombok 46 | lombok 47 | provided 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.cloud 55 | spring-cloud-dependencies 56 | ${spring-cloud.version} 57 | pom 58 | import 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | org.springframework.boot 67 | spring-boot-maven-plugin 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /service-order/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | spring-cloud-study 7 | com.jincou 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | service-order 13 | 14 | 15 | 16 | org.springframework.cloud 17 | spring-cloud-starter-netflix-eureka-client 18 | 19 | 20 | 21 | 22 | org.springframework.cloud 23 | spring-cloud-starter-openfeign 24 | 25 | 26 | 27 | 28 | org.springframework.cloud 29 | spring-cloud-starter-netflix-hystrix 30 | 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-data-redis 36 | 37 | 38 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/OrderApplication.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; 6 | import org.springframework.cloud.openfeign.EnableFeignClients; 7 | 8 | /** 9 | * @Description: 支持熔断降级 和 Feign 10 | * 11 | * @author xub 12 | * @date 2019/7/12 下午12:54 13 | */ 14 | @SpringBootApplication 15 | @EnableFeignClients 16 | //添加熔断降级注解 17 | @EnableCircuitBreaker 18 | public class OrderApplication { 19 | 20 | public static void main(String[] args) { 21 | SpringApplication.run(OrderApplication.class, args); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/client/ProduceClient.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.client; 2 | 3 | import com.jincou.service.order.fallbcak.ProduceClientFallback; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestParam; 7 | 8 | /** 9 | * @Description: 商品服务客户端 10 | * name = "product-service"是你调用服务端名称 11 | * fallback = ProductClientFallback.class,后面是你自定义的降级处理类 12 | * 13 | * @author xub 14 | * @date 2019/7/12 下午1:01 15 | */ 16 | @FeignClient(name = "product-service") 17 | public interface ProduceClient { 18 | 19 | /** 20 | * @Title: 21 | * @Description: 这样组合就相当于http://product-service/api/v1/product/find 22 | * @author xub 23 | * @throws 24 | */ 25 | @GetMapping("/api/v1/produce/find") 26 | String findById(@RequestParam(value = "produceId") int produceId); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/controller/OrderController.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.controller; 2 | 3 | 4 | import com.jincou.service.order.service.ProduceOrderService; 5 | import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.apache.commons.lang.StringUtils; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.data.redis.core.StringRedisTemplate; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestParam; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import javax.servlet.http.HttpServletRequest; 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | import java.util.concurrent.TimeUnit; 18 | 19 | /** 20 | * @author xub 21 | * @Description: 订单服务相关接口 22 | * @date 2019/7/12 下午6:01 23 | */ 24 | @Slf4j 25 | @RestController 26 | @RequestMapping("api/v1/order") 27 | public class OrderController { 28 | 29 | @Autowired 30 | private ProduceOrderService produceOrderService; 31 | 32 | //添加bean 33 | @Autowired 34 | private StringRedisTemplate redisTemplate; 35 | 36 | /** 37 | * 当调用微服务出现异常会降级到saveOrderFail方法中 38 | */ 39 | @RequestMapping("save") 40 | // @HystrixCommand(fallbackMethod = "saveOrderFail") 41 | public Object save(int userId, int productId, HttpServletRequest request) { 42 | 43 | return produceOrderService.save(userId, productId); 44 | } 45 | 46 | /** 47 | * @Description: 异常降级方法 48 | *

49 | * 注意,方法签名一定要要和api方法一致 50 | * @author xub 51 | */ 52 | private Object saveOrderFail(int userId, int productId, HttpServletRequest request) { 53 | //监控报警 54 | String saveOrderKye = "save-order"; 55 | 56 | String sendValue = redisTemplate.opsForValue().get(saveOrderKye); 57 | final String ip = request.getRemoteAddr(); 58 | 59 | // 新启动一个线程进行业务逻辑处理 60 | new Thread(() -> { 61 | if (StringUtils.isBlank(sendValue)) { 62 | System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址是=" + ip); 63 | //发送一个http请求,调用短信服务 TODO 64 | redisTemplate.opsForValue().set(saveOrderKye, "save-order-fail", 20, TimeUnit.SECONDS); 65 | 66 | } else { 67 | System.out.println("已经发送过短信,20秒内不重复发送"); 68 | } 69 | 70 | }).start(); 71 | 72 | Map msg = new HashMap<>(); 73 | msg.put("code", -1); 74 | msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试"); 75 | return msg; 76 | } 77 | 78 | } 79 | 80 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/fallbcak/ProduceClientFallback.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.fallbcak; 2 | 3 | 4 | import com.jincou.service.order.client.ProduceClient; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * @Description: 针对商品服务,错降级处理 9 | * 如果 productlient 一处改成@FeignClient(name = "product-service",fallback = ProduceClientFallback.class) 那就会到这里来 10 | * @author xub 11 | * @date 2019/7/12 下午1:05 12 | */ 13 | @Component 14 | public class ProduceClientFallback implements ProduceClient { 15 | 16 | @Override 17 | public String findById(int productId) { 18 | // System.out.println("ProductClientFallback中的降级方法"); 19 | //这对gai该接口进行一些逻辑降级处理........ 20 | return null; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/model/ProduceOrder.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * 商品订单实体类 13 | */ 14 | @Data 15 | @ToString 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class ProduceOrder implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | /** 23 | * 订单ID 24 | */ 25 | private Integer orderId; 26 | 27 | /** 28 | * 商品名称 29 | */ 30 | private String produceName; 31 | 32 | /** 33 | * 订单号 34 | */ 35 | private String tradeNo; 36 | 37 | /** 38 | * 价格,分 39 | */ 40 | private Integer price; 41 | 42 | /** 43 | * 订单创建时间 44 | */ 45 | private Date createTime; 46 | 47 | /** 48 | * 用户id 49 | */ 50 | private Integer userId; 51 | 52 | /** 53 | * 用户名 54 | */ 55 | private String userName; 56 | } 57 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/service/ProduceOrderService.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.service; 2 | 3 | 4 | import com.jincou.service.order.model.ProduceOrder; 5 | 6 | /** 7 | * @Description: 订单业务类 8 | * 9 | * @author xub 10 | * @date 2019/7/12 下午12:57 11 | */ 12 | public interface ProduceOrderService { 13 | 14 | /** 15 | * @Description: 下单接口 16 | * @author xub 17 | */ 18 | ProduceOrder save(int userId, int produceId); 19 | } 20 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/service/impl/ProduceOrderServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.service.impl; 2 | 3 | 4 | import com.fasterxml.jackson.databind.JsonNode; 5 | import com.jincou.service.order.model.ProduceOrder; 6 | import com.jincou.service.order.client.ProduceClient; 7 | import com.jincou.service.order.service.ProduceOrderService; 8 | import com.jincou.service.order.untils.JsonUtils; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.Date; 14 | import java.util.UUID; 15 | 16 | @Slf4j 17 | @Service 18 | public class ProduceOrderServiceImpl implements ProduceOrderService { 19 | 20 | @Autowired 21 | private ProduceClient produceClient; 22 | 23 | @Override 24 | public ProduceOrder save(int userId, int produceId) { 25 | 26 | //获取json格式的字符串数据 27 | String response = produceClient.findById(produceId); 28 | //Json字符串转换成JsonNode对象 29 | JsonNode jsonNode = JsonUtils.str2JsonNode(response); 30 | 31 | //将数据封装到订单实体中 32 | ProduceOrder produceOrder = new ProduceOrder(); 33 | produceOrder.setCreateTime(new Date()); 34 | produceOrder.setUserId(userId); 35 | produceOrder.setTradeNo(UUID.randomUUID().toString()); 36 | //获取商品名称和商品价格 37 | produceOrder.setProduceName(jsonNode.get("produceName").toString()); 38 | produceOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString())); 39 | 40 | log.info("最终生成的订单信息为 = {}",produceOrder); 41 | return produceOrder; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /service-order/src/main/java/com/jincou/service/order/untils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.order.untils; 2 | 3 | import com.fasterxml.jackson.databind.JsonNode; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | 6 | import java.io.IOException; 7 | 8 | /** 9 | * @Description: json工具类 10 | * 11 | * @author xub 12 | * @date 2019/7/12 下午12:58 13 | */ 14 | public class JsonUtils { 15 | 16 | 17 | private static final ObjectMapper objectMappper = new ObjectMapper(); 18 | 19 | /** 20 | * json字符串转JsonNode对象的方法 21 | */ 22 | public static JsonNode str2JsonNode(String str){ 23 | try { 24 | return objectMappper.readTree(str); 25 | } catch (IOException e) { 26 | return null; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /service-order/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9001 3 | 4 | #指定注册中心地址 5 | eureka: 6 | client: 7 | serviceUrl: 8 | defaultZone: http://localhost:7001/eureka/ 9 | 10 | #服务的名称 11 | #redis 12 | spring: 13 | application: 14 | name: order-service 15 | redis: 16 | database: 0 17 | host: 127.0.0.1 18 | port: 6379 19 | 20 | 21 | #开启feign支持hystrix (注意,一定要开启,旧版本默认支持,新版本默认关闭) 22 | # #修改调用超时时间默认是1秒就算超时 23 | feign: 24 | hystrix: 25 | enabled: true 26 | client: 27 | config: 28 | default: 29 | connectTimeout: 5000 30 | readTimeout: 5000 -------------------------------------------------------------------------------- /service-produce/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | spring-cloud-study 7 | com.jincou 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | servce-produce 13 | 14 | 15 | 16 | 17 | 18 | org.springframework.cloud 19 | spring-cloud-starter-netflix-eureka-client 20 | 21 | 22 | 23 | 24 | org.springframework.cloud 25 | spring-cloud-config-client 26 | 27 | 28 | 29 | 30 | com.alibaba 31 | fastjson 32 | 1.2.49 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/ProduceApplication.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | /** 7 | * @ClassName: ProduceApplication 8 | * @Description: 商品服务启动类 9 | * @author xub 10 | * @date 2019/7/12 下午12:29 11 | */ 12 | @SpringBootApplication 13 | public class ProduceApplication { 14 | 15 | public static void main(String[] args) { 16 | SpringApplication.run(ProduceApplication.class, args); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/controller/ConfigController.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce.controller; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | 9 | /** 10 | * @ClassName: ConfigController 11 | * @Description: 去配置中心读取配置信息 12 | * @author xub 13 | * @date 2019/7/12 下午12:31 14 | */ 15 | @Slf4j 16 | @RestController 17 | @RequestMapping("/api/v1/product") 18 | public class ConfigController { 19 | 20 | 21 | /** 22 | * 配置中心读取数据 23 | */ 24 | @Value("${item_url}") 25 | private String url; 26 | 27 | 28 | @RequestMapping("url") 29 | public void list(){ 30 | log.info("去配置中心读取的url为={}", url); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/controller/ProduceController.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce.controller; 2 | 3 | 4 | import com.alibaba.fastjson.JSON; 5 | import com.jincou.service.produce.service.ProduceService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestParam; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | 13 | /** 14 | * @Description: 商品服务对外提供接口 15 | * 16 | * @author xub 17 | * @date 2019/7/12 下午12:43 18 | */ 19 | @RestController 20 | @RequestMapping("/api/v1/produce") 21 | public class ProduceController { 22 | 23 | @Autowired 24 | private ProduceService produceService; 25 | 26 | /** 27 | * 获取所有商品列表 28 | * @return 29 | */ 30 | @RequestMapping("list") 31 | public Object list(){ 32 | return produceService.listProduce(); 33 | } 34 | 35 | /** 36 | * t 37 | * @return 38 | */ 39 | @GetMapping("/find") 40 | public String findById(@RequestParam(value = "produceId") int produceId){ 41 | return JSON.toJSONString(produceService.findById(produceId)); 42 | 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/model/Produce.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * @ClassName: Produce 11 | * @Description: 商品实体信息 12 | * @author xub 13 | * @date 2019/7/12 下午12:33 14 | */ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class Produce implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | /** 23 | * 商品ID 24 | */ 25 | private Integer produceId; 26 | 27 | /** 28 | * 商品名称 29 | */ 30 | private String produceName; 31 | 32 | /** 33 | * 商品价格 34 | */ 35 | private Integer price; 36 | 37 | /** 38 | * 商品库存 39 | */ 40 | private Integer store; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/service/ProduceService.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce.service; 2 | 3 | 4 | import com.jincou.service.produce.model.Produce; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @ClassName: ProduceService 10 | * @Description: 获取商品信息相关接口 11 | * @author xub 12 | * @date 2019/7/12 下午12:37 13 | */ 14 | public interface ProduceService { 15 | 16 | /** 17 | * @Description: 查找所有商品 18 | * @author xub 19 | */ 20 | List listProduce(); 21 | 22 | 23 | /** 24 | * 根据商品ID查找商品 25 | */ 26 | Produce findById(int produceId); 27 | } 28 | -------------------------------------------------------------------------------- /service-produce/src/main/java/com/jincou/service/produce/service/impl/ProduceServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.jincou.service.produce.service.impl; 2 | 3 | 4 | 5 | import com.jincou.service.produce.model.Produce; 6 | import com.jincou.service.produce.service.ProduceService; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.*; 10 | 11 | @Service 12 | public class ProduceServiceImpl implements ProduceService { 13 | 14 | private static final Map daoMap = new HashMap<>(); 15 | 16 | /** 17 | * 模拟数据库商品数据 18 | */ 19 | static { 20 | Produce p1 = new Produce(1, "苹果X", 9999, 10); 21 | Produce p2 = new Produce(2, "冰箱", 5342, 19); 22 | Produce p3 = new Produce(3, "洗衣机", 523, 90); 23 | Produce p4 = new Produce(4, "电话", 64345, 150); 24 | daoMap.put(p1.getProduceId(), p1); 25 | daoMap.put(p2.getProduceId(), p2); 26 | daoMap.put(p3.getProduceId(), p3); 27 | daoMap.put(p4.getProduceId(), p4); 28 | } 29 | 30 | 31 | @Override 32 | public List listProduce() { 33 | Collection collection = daoMap.values(); 34 | List list = new ArrayList<>(collection); 35 | return list; 36 | } 37 | 38 | @Override 39 | public Produce findById(int id) { 40 | return daoMap.get(id); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /service-produce/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #指定注册中心地址 4 | eureka: 5 | client: 6 | serviceUrl: 7 | defaultZone: http://localhost:7001/eureka/ 8 | 9 | #服务的名称 10 | spring: 11 | application: 12 | name: product-service 13 | 14 | #指定从哪个配置中心读取 15 | cloud: 16 | config: 17 | discovery: 18 | service-id: config-server-jdbc 19 | enabled: true 20 | profile: dev 21 | label: dev 22 | 23 | server: 24 | port: 8001 25 | 26 | 27 | -------------------------------------------------------------------------------- /zuul-service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | spring-cloud-study 7 | com.jincou 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | zuul-service 13 | 14 | 15 | 16 | 17 | org.springframework.cloud 18 | spring-cloud-starter-netflix-eureka-client 19 | 20 | 21 | 22 | 23 | org.springframework.cloud 24 | spring-cloud-starter-netflix-zuul 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /zuul-service/src/main/java/com/jincou/zuul/service/ZuulServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.jincou.zuul.service; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.zuul.EnableZuulProxy; 6 | 7 | /** 8 | * @ClassName: ZuulServiceApplication 9 | * @Description: 网关 10 | * @author xub 11 | * @date 2019/7/12 下午3:53 12 | */ 13 | @SpringBootApplication 14 | //加上网关注解 15 | @EnableZuulProxy 16 | public class ZuulServiceApplication { 17 | 18 | public static void main(String[] args) { 19 | SpringApplication.run(ZuulServiceApplication.class, args); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /zuul-service/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 6001 3 | 4 | 5 | #服务的名称 6 | spring: 7 | application: 8 | name: zuul-gateway 9 | 10 | 11 | 12 | #指定注册中心地址 13 | eureka: 14 | client: 15 | serviceUrl: 16 | defaultZone: http://localhost:7001/eureka/ 17 | 18 | #/order-service/api/v1/order/save?user_id=2&product_id=1 19 | #自定义路由映射 20 | zuul: 21 | routes: 22 | order-service: /apigateway/order/** 23 | product-service: /apigateway/product/** 24 | #统一入口为上面的配置,其他入口忽略 25 | ignored-patterns: /*-service/** 26 | #忽略整个服务,对外提供接口 27 | ignored-services: order-service --------------------------------------------------------------------------------