微服务spring cloud项目从零搭建(二)

一、前言

	在之前的商品微服务搭建中,已经简要介绍了商品微服务搭建必要的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集群交互机制流程图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/

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值