├── .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 | 
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
--------------------------------------------------------------------------------