一、前言
在之前的商品微服务搭建中,已经简要介绍了商品微服务搭建必要的spring cloud相关依赖,以及application.properties中的相关配置等等。
本节主要阐述,订单微服务搭建,订单微服务和spring cloud中的产品erueka的原理以及使用。
二、项目搭建
1.项目的搭建环境
- 编辑器:spring tool suit(STS)
- JDK:1.8
- 项目构建工具:maven
2.开始搭建
1.新建maven项目 new maven project
2.打包方式jar
3.指定jdk版本及添加Spring Cloud依赖
<!-- 定义变量 -->
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- spring boot web dependency -->
<dependencies>
<!-- 导入Eureka依赖服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson.dataformat.xml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.23</version>
</dependency>
</dependencies>
4.创建pojo,controller,service对应的包结构(一共分为三步)、配置文件等
4.1创建pojo,controller,service及文件,添加set、get方法
4.1.1.pojo
item.java:
private Long id;
private String title;
private String pic;
private String desc;
private Long price;
order.java:
private String orderId;
private Long userId;
private Date createDate;
private Date updateDate;
private List<OrderDetail> orderDetail;
orderDetail.java:
private String orderId;
private Item item;
4.1.2.service,构造假数据
1.OrderService.java
package cn.itcast.microservice.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.itcast.microservice.pojo.Item;
import cn.itcast.microservice.pojo.Order;
import cn.itcast.microservice.pojo.OrderDetail;
@Service
public class OrderService {
private static final Map<String, Order> MAP = new HashMap<String,Order>();
static {
//构造测试数据
Order order = new Order();
order.setOrderId("1234567890");
order.setUserId(1L);
order.setCreateDate(new Date());
order.setUpdateDate(new Date());
//创建list集合对象,
ArrayList<OrderDetail> orderDetail = new ArrayList<OrderDetail>();
Item item = new Item();
item.setId(1L);
orderDetail.add(new OrderDetail(order.getOrderId(), item));
item = new Item();
item.setId(2L);
orderDetail.add(new OrderDetail(order.getOrderId(), item));
order.setOrderDetail(orderDetail);
MAP.put(order.getOrderId(), order);
}
@Autowired
private ItemService itemService;
/**
* 根据订单的id查询订单数据
* @param orderId
* @return
*/
public Order queryOrderById(String orderId) {
Order order = MAP.get(orderId);
/**
* 获取Order对象中所有的orderDetail,然后遍历,获取没一个OrderDetail对象,然后从orderDetail对象中获取商品的id,
* 然后调用商品微服务查询该商品
*/
List<OrderDetail> orderDetails = order.getOrderDetail();
for (OrderDetail orderDetail : orderDetails) {
Item item = itemService.queryItemById(orderDetail.getItem().getId());
orderDetail.setItem(item);
}
//返回
return order;
}
}
2.ItemService.java
package cn.itcast.microservice.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.eureka.config.DiscoveryClientOptionalArgsConfiguration;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import cn.itcast.microservice.pojo.Item;
@Service
public class ItemService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
public Item queryItemById(Long id ) {
String serviceId = "itcast-microservice-item";
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
if(instances == null || instances.isEmpty()) {
return null;
}
ServiceInstance serviceInstance = instances.get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
String url = "http://"+port+":"+host;
Item item = restTemplate.getForObject(url + "/item/" + id, Item.class);
return item;
}
}
4.1.3.controller
package cn.itcast.microservice.controller;
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;
import cn.itcast.microservice.pojo.Order;
import cn.itcast.microservice.service.OrderService;
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping(value="/order/{orderId}")
public Order queryOrderById(@PathVariable(name="orderId") String orderId) {
return orderService.queryOrderById(orderId);
}
}
4.2.创建OrderApplication入口文件,注意文件的位置一定要放在pojo,service,controller的上层
package cn.itcast.microservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient //申明这是erueka service 的客户端
@SpringBootApplication
public class OrderApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
4.3.application.properties配置文件
#端口号
server.port=8081
#服务名称
spring.application.name=itcast-microservice-order
#是否注册到eureka注册中心
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://127.0.0.1:6868/eureka/
eureka.instance.prefer-ip-address=true
5.eureka原理及相关的配置
为了解决商品微服务ip地址发生变化时,或者说我们商品微服务部署了多份,订单微服务如何去调用?
我们需要通过服务发现与注册机制来处理-推荐使用注册中心eureka、ZooKeeper(阿里的doubbo):
Eureka集群交互机制流程图
3.eureka注册中心及相关的配置
1:eureka注册中心service发布代码
package cn.itcast.microservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer //申明这个项目是eureka服务端
@SpringBootApplication
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
2:eureka注册中心相关的配置
4.运行测试
先运行eureka,服务中心,再运行商品item,最后运行order service
server.port=6868
#\u662F\u5426
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone = http://127.0.0.1:${server.port}/eureka/