springboot+springcloud+Eureka 实现微服务系统架构

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 https://blog.csdn.net/weixin_43863007/article/details/88898235

关于Spring Cloud:

  • Spring cloud并不是一个项目,它是一套项目的组合,Spring cloud中存在很多的子项目,每一个子项目都是针对微服务系统架构存在的问题给出的一种解决方案,Springcloud是基于Springboot实现的,Springcloud并没有重复的造轮子,它只是将目前各家公司开发的比较成熟,经得起实际考验的服务组合起来

使用Spring cloud搭建微服务系统(订单微服务+商品微服务):

1.商品微服务的搭建:
  1. 创建一个maven项目,项目名称item:
  2. 在pom.xml文件中添加依赖:定义版本变量,添加父级依赖,添加web支持
<!-- 定义版本变量 -->
  <properties>
  	<java.version>1.8</java.version>
  </properties>
  
  <!-- 父级依赖,在这里直接通过Springboot给我们提供的父工程 -->
  <!-- 通过依赖父工程,jar包的管理版本等等都不需要自己来管理 -->
  <parent>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-parent</artifactId>
  	<version>1.5.6.RELEASE</version>
  </parent>
  
  <!-- 加人web的支持,要使用SpringMVC和Spring的jar包,只需要在这里做个依赖就可以 -->
  <dependencies>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
  </dependencies>
  1. 创建实体类Item,添加get Set方法;无参构造;带参构造;toString方法:
商品微服务实体类
public class Item {
	private Integer id;		//唯一标识id
	private String title;	//商品标题
	private String pic;		//图片的地址
	private String desc;	//描述信息
	private Integer price;	//价格
	get Set方法;无参构造;带参构造;toString方法
}
  1. 编写service层,添加@service注解,初始化数据,编写查询方法:
@Service
public class ItemService {
	//初始化数据
	private static final Map<Integer, Item> map = new HashMap<Integer,Item>();
	static{
		map.put(1, new Item(1, "商品标题1", "http://图片1", "商品描述1", 100));
		map.put(2, new Item(1, "商品标题2", "http://图片2", "商品描述2", 200));
		map.put(3, new Item(1, "商品标题3", "http://图片3", "商品描述3", 300));
		map.put(4, new Item(1, "商品标题4", "http://图片4", "商品描述4", 400));
		map.put(5, new Item(1, "商品标题5", "http://图片5", "商品描述5", 500));
	}
	
	//根据商品的ID进行查询
	public Item queryItemById(Integer id){
		return map.get(id);
	}
}
  1. 编写controller层:
@RestController
public class ItemController {
	@Autowired
	private ItemService itemservice;
	
	@RequestMapping(value="/item/{id}",method=RequestMethod.GET)
	public Item queryItemById(@PathVariable(name="id") Integer id){
		return itemservice.queryItemById(id);
	}
}
  1. 编程程序入口:
程序入口
//用来声明当前应用是eureka的一个客户端
@EnableDiscoveryClient
@SpringBootApplication
public class ItemApplication {
	public static void main(String[] args) {
		SpringApplication.run(ItemApplication.class, args);
	}
}
  1. 编写全局配置文件,指定端口号:
server.port=8083
  1. 这是可以根据端口号和controller层的访问路径加上id参数访问商品微服务项目
2.订单微服务搭建:
  1. 配置pom.xml问价的依赖:
<!-- 定义版本变量 -->
  <properties>
  	<java.version>1.8</java.version>
  </properties>
  
  <!-- 父级依赖,在这里直接通过Springboot给我们提供的父工程 -->
  <!-- 通过依赖父工程,jar包的管理版本等等都不需要自己来管理 -->
  <parent>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-parent</artifactId>
  	<version>1.5.6.RELEASE</version>
  </parent>
  
  <!-- 加人web的支持,要使用SpringMVC和Spring的jar包,只需要在这里做个依赖就可以 -->
  <dependencies>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
 </dependencies>
  1. 编写实体类(三个):添加get Set方法;无参构造;带参构造;toString方法
订单实体类
public class Order {
	private String orderId;			//订单的id
	private Integer userId;			//用户id
	private Date createDate;		//创建时间
	private Date updateDate;		//修改时间
	private List<OrderDatail> orderDatails;//订单详情
}
订单详情
public class OrderDatail {
	private String orderId;	//订单
	private Item item;		//商品
}
商品微服务实体类
public class Item {
	private Integer id;		//唯一标识id
	private String title;	//商品标题
	private String pic;		//图片的地址
	private String desc;	//描述信息
	private Integer price;	//价格
}
  1. 编写service层:
@Service
public class OrderService {
	private static final Map<String, Order> map = new HashMap<String,Order>();
	static{
		//构造测试数据
		Order order = new Order();
		order.setOrderId("1102");
		order.setCreateDate(new Date());
		order.setUpdateDate(order.getCreateDate());
		order.setUserId(1);
		
		//创建OrderDatail集合对象
		List<OrderDatail> orderDatails = new ArrayList<OrderDatail>();
		//初始化商品数据
		Item item = new Item();
		item.setId(1);
		orderDatails.add(new OrderDatail(order.getOrderId(), item));
		item = new Item();
		item.setId(2);
		orderDatails.add(new OrderDatail(order.getOrderId(), item));
		//将orderdatail数据集设置给Order对象
		order.setOrderDatails(orderDatails);
		//将Order对象添加到map中
		map.put(order.getOrderId(), order);
	}
	
	@Autowired
	private ItemService itemservice;

	//根据订单id查询订单数据
	public Order queryOrderbyId(String orderId){
		Order order = map.get(orderId);
		//获取Order中所有的orderDatail,然后进行遍历,然后获取每一个orderdatail对象
		//然后从OrderDatail中获取商品的id,然后调用商品微服务查询商品信息
		List<OrderDatail> orderDatails = order.getOrderDatails();
		for(OrderDatail orderDatail : orderDatails){
			Integer id = orderDatail.getItem().getId();
			Item item = itemservice.queryItemById(id);
			orderDatail.setItem(item);
		}
		return order;
	}
}
@Service
public class ItemService {
	@Autowired
	private RestTemplate restemplate;
	@Value("${itcast.item.url}")
	private String itemUrl;
	
	public Item queryItemById(Integer id){
		Item item = restemplate.getForObject(itemUrl+id, Item.class);
		return item;
	}
}
  1. 编写controller层:
@RestController
public class OrderController {
	@Autowired
	private OrderService orderService;
	
	@GetMapping(value="/order/{orderId}")
	public Order queryOrderById(@PathVariable(name="orderId") String orderId){
		return orderService.queryOrderbyId(orderId);
	}
}
  1. 编写程序入口:
@EnableDiscoveryClient//声明这是一个Eureka客户端
@SpringBootApplication
public class OrderApplication {
	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
	}
	
	public static void main(String[] args) {
		SpringApplication.run(OrderApplication.class, args);
	}
}
  1. 配置全局文件:
server.port=8082

itcast.item.url = http://localhost:8083/item/
3. RestTemplat底层使用OKHttp来完成HTTP请求的发送:
  1. 添加OKHttp依赖
<!-- 添加OKHttp依赖 -->
  	<dependency>
  		<groupId>com.squareup.okhttp3</groupId>
  		<artifactId>okhttp</artifactId>
  		<version>3.9.0</version>
  	</dependency>
  1. 在启动类中创建RestTemplat对象的时候传递一个工厂类:
	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
	}
4.使用Eureka Server框架开发,实现微服务架构:
  1. 创建一个maven项目:eureka
  2. 配置pom.xml文件,版本定义,父级依赖,Springcloud依赖管理,Eureka依赖:
<!-- 定义版本变量 -->
  <properties>
  	<java.version>1.8</java.version>
  </properties>
  
  <!-- 父级依赖,在这里直接通过Springboot给我们提供的父工程 -->
  <!-- 通过依赖父工程,jar包的管理版本等等都不需要自己来管理 -->
  <parent>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-parent</artifactId>
  	<version>1.5.6.RELEASE</version>
  </parent>
  
  <!-- 导入Springcloud的依赖管理 -->
  <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>
  
  <dependencies>
  	<!-- 导入Eureka服务的依赖 -->
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-eureka-server</artifactId>
  	</dependency>
  </dependencies>
  1. 编写启动类,添加声明注解:
//生命这个项目是Eureka服务端,注册中心
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServer.class, args);
	}
}
  1. 编写配置文件:
server.port=8081
#是否需要将应用注册到注册中心,
eureka.client.registerWithEureka=false
#是否从注册中心获取注册信息
eureka.client.fetchRegistry=false
#客户端与服务端进行交互的地址
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
5. 把商品微服务注册到注册中心:
  1. 在Item项目中的pom中导入cloud和Eureka依赖:
<!-- 导入Springcloud的依赖管理 -->
  <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>
  
	<!-- 导入Eureka服务的依赖 -->
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-eureka-server</artifactId>
  	</dependency>
  1. 修改全局配置文件:
#给应用服务起一个名字
spring.application.name=item
#是否需要将应用注册到注册中心,
eureka.client.registerWithEureka=true
#是否从注册中心获取注册信息
eureka.client.fetchRegistry=false
#客户端与服务端进行交互的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
#将自己的ip地址注册到注册中心
eureka.instance.prefer-ip-address=true
  1. 在启动类中添加一个注解来声明:
//用来声明当前应用是eureka的一个客户端
@EnableDiscoveryClient
6. 订单微服务从注册中心获取商品信息:
  1. 在Order中的pom文件中添加cloud和Eureka依赖:
<!-- 导入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>

	<!-- 导入Springcloud的依赖管理 -->
  <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>
  1. 修改全局配置文件:
#给应用服务起一个名字
spring.application.name=order
#是否需要将应用注册到注册中心,
eureka.client.registerWithEureka=false
#是否从注册中心获取注册信息
eureka.client.fetchRegistry=true
#客户端与服务端进行交互的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
  1. 修改ItemService,改成下面的格式:
@Service
public class ItemService {
@Autowired
	private RestTemplate restemplate;
	
	@Autowired
	private DiscoveryClient discoveryClient;
	
	public Item queryItemById(Integer id){
		String serviceId = "item";//在配置文件中起的名字
		List<ServiceInstance> instance = discoveryClient.getInstances(serviceId);
		//服务两列表判断是否为空
		if(instance==null || instance.isEmpty()){
			return null;
		}
		ServiceInstance serviceInstance = instance.get(0);
		//serviceInstance.getHost();//获取主机名
		//serviceInstance.getPort();//获取端口号
		String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort();
		Item item = restemplate.getForObject(url+"/item/"+id, Item.class);
		return item;
	}
}
  1. 启动类加一个注解来声明:
//声明这是一个Eureka客户端
@EnableDiscoveryClient

猜你喜欢

转载自blog.csdn.net/weixin_43863007/article/details/88898235