本章课程学习目标:
(1)Spring Cloud微服务架构
(2)服务发现组件 Eureka与Feign实现服务间的调用框架
(3)SHOP商城微服务 Eureka与Feign组件的应用
1Spring Cloud简介
1.1什么是Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.2Spring Cloud与spring boot的关系
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单
个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,可以不基于Spring Boot吗?不可以。
Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开
Spring Boot,属于依赖的关系。
1.3Spring Cloud主要框架
- 服务发现—— Netflix Eureka
- 服务调用—— Netflix Feign
- 熔断器——Netflix Hystrix
- 服务网关—— Netflix Zuul
- 分布式配置——Spring Cloud Config
- 消息总线 —— Spring Cloud Bus
1.4Spring Cloud与dubbo对比
或许很多人会说Spring Cloud和Dubbo的对比有点不公平,Dubbo只是实现了服务治理,而Spring Cloud下面有17个子项目(可能还会新增)分别覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo只是Spring Cloud Netflix中的一个子集。
Dubbo | Spring cloud | |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netflix Eureka |
服务调用方式 | RPC | REST API |
服务网关 | 无 | Spring Cloud Netflix Zuul |
熔断器 | 无 | Spring Cloud Netflix Hystrix |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
2 服务发现组件 Eureka
Spring Cloud Eureka是Spring Cloud Netflix 子项目的核心组件之一,主要用于微服务架构中的服务治理。
Eureka包含两个组件:
Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注
册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
3Feign实现服务间的调用
3.1Feign简介
Feign是简化Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于Retrofit、JAXRS-2.0WebSocket。Feign的初衷是降低统一绑定Denominator到HTTP API的复杂度,不区分是否为restful。
4微服务代码实战
案例demo:搭建spring boot微服务项目,目前包含订单微服务和商品微服务。以及base基础功能微服务。
如何利用spring Cloud 服务发现组件和服务调用组件Feign去开发一个简单的小型微服务。
4.1首先创建spring boot单体项目
创建如上图meaven项目 shop_base基础商城微服务
Shop_order订单微服务
Shop_product商品微服务
4.2将每一个微服务的数据库配置增删改查配置一遍
数据库表建设完成
4.2.1测试spring boot单体架构项目
- 查询商品列表
- 查询订单列表
4.3搭建商城shop微服务注册中心Eureka
4.3.1新建注册中心模块shop_eureka配置pom.xml
4.3.2添加application.yml
4.3.3配置启动类开启注册中心服务
创建包com.springcloud.eureka ,包下建立类:
package com.springcloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
//开启服务注册中心服务
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
4.3.4启动运行启动类
浏览器输入地址:http://localhost:9898/ 运行效果如下图:
4.4将订单微服务和商品微服务注册到Eureka服务中心
如何将订单微服务shop_order和shop_product注入到eureka服务中心呢?
4.4.1添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
4.4.2修改application.yml,添加注册eureka服务的配置
eureka:
client:
service‐url:
defaultZone: http://localhost:9898/eureka
instance:
prefer‐ip‐address: true
4.4.3修改服务启动类,添加注解
@EnableEurekaClient
4.4.4启动测试
启动测试:将订单和商品微服务启动起来,会发现eureka的注册列表中可以看到这些微服务了。
4.5如何利用Feign进行商品微服务和订单微服务的调用
创建订单服务:
(调用商品微服务)
(1)调用 商品微服务进行商品列表查询
4.5.1Order微服务调用接口查询商品列表(Feign服务调用)
由于orader订单属于订单微服务,商品属于商品微服务,所以现在要使用订单微服务去申请调用商品微服务接口的开发。
- 在shop_order模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2 修改shop_order模块的启动类,添加注解
@EnableDiscoveryClient
@EnableFeignClients
3. 在shop_order模块创建 com.springcloud.order.client包,包下创建接口
@FeignClient("shop-product")
public interface ProductClient {
/***
* 查询商品列表
* 相当于就是商品微服务中的controller
*/
@RequestMapping(value="/search",method = RequestMethod.POST)
public Result findSearch(@RequestBody Map searchMap);
}
4. 修改shop_order模块的OrderController
/***
* 订单微服务调用商品微服务
*/
@Autowired
private ProductClient productClient;
@RequestMapping(value = "/search/product")
public Result findProducts(@RequestBody Map searchMap){
Result result = productClient.findSearch(searchMap);
return result;
}
5 测试
注意启动的先后顺序:先启动product微服务
测试结果成功:看来Feign可以实现微服务之间的调用
4.5.2项目中业务逻辑处理微服务之间调用
上面只是测试一下订单中使用商品微服务。
创建订单接口: 首先查询订单的商品列表信息(需要调用商品微服务)
需要根据商品减少库存(需要调用商品微服务)
用户创建订单。
代码实现
我们现在就从controller编写一个创建订单的接口:
/**
* 创建订单
* @param order
*/
@RequestMapping(method=RequestMethod.POST)
public Result add(@RequestBody Order order ){
orderService.add(order);
return new Result(true,StatusCode.OK,"增加成功");
}
Service层中加入创建订单步骤
/**
* 增加
* @param order
*/
public void add(Order order) {
/*****
* (1)调用商品微服务进行查询调用,查询列表
*/
Result result = productClient.findSearch(new HashMap());
Object obj=result.getData();
System.out.println("订单微服务Feign远程调用查询商品微服务列表信息:");
/****
* (2)调用商品微服务进行库存减少
*/
order.setId( idWorker.nextId()+"" );
orderDao.save(order);
}
测试结果:
5个人说明
经验是由一点一点积累的,思维也是由一天一天训练出来的。
谢谢大家的阅读,原创不易,如果你认为文章对你有所帮助,就点个赞感谢大家支持,你的点赞是我持续写作的动力。
来源:CSDN
作者:LRyab
链接:https://blog.csdn.net/liguanghui1311/article/details/103465475