微服务项目功能介绍
上一小节已经对商城管理项目的结构进行了简单介绍,但具体的配置细节和功能还没有讲解,本节将针对这些子项目的配置和功能作进一步的说明。
1.microservice-eureka-server(Eureka注册中心)
该子项目使用了Spring Cloud的组件Eureka,主要用于搭建一个服务注册中心, microservice-gateway-zuul、microservice-orderservice和microservice-userservice都将通过配置注册到该注册中心。
其对应的配置文件application.yml的具体内容,如文件1所示。
文件1 application.yml
1 spring:
2 application:
3 name: eureka-server # 指定应用名称
4 server:
5 port: 8761
6 eureka:
7 client:
8 register-with-eureka: false
9 fetch-registry: false
10 service-url:
11 defaultZone: http://localhost:${server.port}/eureka/
12 # 上线测试需要使用以下配置,eureka-server表示对应的服务名称
13 # defaultZone: http://eureka-server:${server.port}/eureka/
在文件1中,配置了应用名称和服务端口,同时通过Eureka的相关配置指定了Eureka注册中心的地址为http://localhost:${server.port}/eureka/
(即http://localhost:8761/eureka/
),当部署到测试或线上环境时,需要根据上面注释中的提示信息进行地址更改。
2.microservice-gateway-zuul(Zuul API网关)
该子项目使用了Spring Cloud的组件Zuul,主要作为其他微服务项目的API网关,来实现其他微服务接口的动态代理。microservice-orderservice和microservice-userservice微服务都可以使用Zuul网关服务进行代理请求。
其对应的配置文件application.yml的具体内容,如文件2所示。
文件2 application.yml
1 spring:
2 application:
3 name: gateway-zuul # 指定应用名称
4 server:
5 port: 8050
6 eureka:
7 client:
8 #配置Eureka注册中心地址
9 serviceUrl:
10 defaultZone: http://localhost:8761/eureka/
11 # 上线测试需要使用以下配置
12 # defaultZone: http://eureka-server:8761/eureka/
13 zuul:
14 ignoredServices: '\*'
15 routes:
16 user-service:
17 path: /user-service/\**
18 serviceId: user-service
19 order-service:
20 path: /order-service/**
21 serviceId: order-service
在文件2中,同样先配置了应用名称和服务端口,同时通过Eureka的相关配置将该API网关服务注册到了Eureka注册中心(这里需要注意当部署到测试或线上环境时,需要根据上面注释中的提示信息进行注册地址修改)。最后部分实现了Zuul的相关配置,分别配置了serviceId为user-service和order-service的两个应用的路径映射。
3.microservice-orderservice(订单管理微服务)
该子项目就是一个使用传统的Spring Boot框架开发的订单管理微服务项目,主要用于进行商城订单管理,并提供有关订单管理的RESTFUL风格的API接口方法。
其对应的配置文件application.yml的具体内容,如文件3所示。
文件3 application.yml
1 # 数据库配置
2 spring:
3 datasource:
4 driver-class-name: com.mysql.jdbc.Driver
5 url: jdbc:mysql://localhost:3306/microservice_mallmanagement
6 # 与Docker整合时可使用以下配置(也可以使用具体的IP+端口)
7 # url: jdbc:mysql://mysql:3306/microservice_mallmanagement
8 username: root
9 password: root
10 application:
11 name: order-service # 指定应用名称
12 server:
13 port: 7900 # 指定该Eureka实例的端口号
14 eureka:
15 client:
16 #配置Eureka注册中心地址
17 service-url:
18 defaultZone: http://localhost:8761/eureka/
19 # 上线测试需要使用以下配置
20 # defaultZone: http://eureka-server:8761/eureka/
在文件3中,除配置了服务的应用名称、端口以及Eureka注册中心外,还额外增加了MySQL数据库的配置。微服务项目会根据具体需求配置各自不同的数据库,本书为了方便理解和学习都以MySQL数据库为例。
上述配置文件不仅要注意上线测试时需要修改Eureka注册中心配置,还需要注意MySQL数据库url的配置。如果MySQL数据库使用非Docker容器方式进行配置,那么MySQL数据库的url要修改为“MySQL数据库服务的IP+端口”的形式;如果是使用Docker容器启动的MySQL数据库服务,那么MySQL数据库的url要根据上面的提示修改为“MySQL数据库的服务名称或容器名称+端口号”的形式。
该项目对应的控制器类OrderController的具体内容,如文件4所示。
文件4 OrderController.java
1 ...
2 @RestController
3 @RequestMapping("/order")
4 public class OrderController {
5 @Autowired
6 private OrderMapper orderMapper;
7 @GetMapping(path="/findOrders/{userid}")
8 @HystrixCommand(fallbackMethod = "findOrderfallback") //熔断器
9 public List<Order> findOrder(@PathVariable("userid")Integer userid) {
10 List<Order> orders= this.orderMapper.selectOrder(userid);
11 return orders;
12 }
13 //针对上面熔断器发现的问题编写回调方法(参数和返回值要一样)
14 public List<Order> findOrderfallback(Integer userid) {
15 List<Order> orders =new ArrayList<>();
16 return orders;
17 }
18 }
从文件4可以看出,该订单管理项目的接口控制器类OrderController中只是简单的定义了一个根据userid查询订单集合的方法,同时该方法中还通过@HystrixCommand注解配置了Spring Cloud的熔断器Hystrix,并编写了回调方法。
4.microservice-userservice(用户管理微服务)
该子项目也是一个传统的Spring Boot框架开发的用户管理微服务项目,主要用于进行商城用户管理,并提供有关用户管理的RESTFUL风格的API接口方法。
其对应的配置文件application.yml的具体内容,如文件5所示。
文件5 application.yml
1 # 数据库配置
2 spring:
3 datasource:
4 driver-class-name: com.mysql.jdbc.Driver
5 url: jdbc:mysql://localhost:3306/microservice_mallmanagement
6 # 与Docker整合时可使用以下配置(也可以使用具体的IP+端口)
7 # url: jdbc:mysql://mysql:3306/microservice_mallmanagement
8 username: root
9 password: root
10 application:
11 name: user-service # 指定应用名称
12 server:
13 port: 8030 # 指定该Eureka实例的端口号
14 eureka:
15 client:
16 #配置Eureka注册中心地址
17 service-url:
18 defaultZone: http://localhost:8761/eureka/
19 # 上线测试需要使用以下配置
20 # defaultZone: http://eureka-server:8761/eureka/
21 #客户端动态访问常量配置
22 ORDERSERVICEURL: http://order-service/
从文件5可以看出,用户管理微服务的配置和订单管理微服务的配置基本相同。除了服务名称和端口外,只是增加了一个Spring Cloud组件Ribbon提供的客户端负载均衡常量ORDERSERVICEURL的配置(原本是订单服务的IP+端口号)。
该项目对应的控制器类UserController的具体内容,如文件6所示。
文件6 UserController.java
1 ...
2 @RestController
3 @RequestMapping("/user")
4 public class UserController {
5 @Autowired
6 private RestTemplate restTemplate;
7 @Autowired
8 private UserMapper userMapper;
9 @Value("${ORDERSERVICEURL}")
10 private String ORDERSERVICEURL;
11 @GetMapping(path="/findOrders/{username}")
12 public List<Order> getOrderByUsername(@PathVariable("username")
13 String username) {
14 User user = this.userMapper.selectUser(username);
15 //使用Ribbon后,可以使用http://order-service/而不用使用IP+端口
16 ResponseEntity<List<Order>> rateResponse =
17 restTemplate.exchange(ORDERSERVICEURL
18 +"/order/findOrders/"+user.getId(),
19 HttpMethod.GET, null,
20 new ParameterizedTypeReference<List<Order>>(){});
21 List<Order> orders = rateResponse.getBody();
22 return orders;
23 }
24 }
从文件6可以看出,UserController中也只是简单的定义了一个根据username查询订单集合的getOrderByUsername()方法。执行方法时,会通过@Value注解使用Ribbon客户端负载均衡的功能引入配置文件中订单微服务的常量值ORDERSERVICEURL,然后在方法中先通过username查询出对应的userid,然后使用RestTemplate的exchange()方法远程调用订单管理微服务接口进行订单集合查询。
文件6中,RestTemplate的exchange()方法用于远程调用其他RESTFUL接口方法,并返回指定的对象集合。其方法的四个参数分别表示请求地址、请求方式、请求参数实体以及返回结果对象。
至此,商城管理系统的整体结构和子项目功能及主要配置就已介绍完毕。