1.SpringCloud概述
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,集群状态。(用来管理项目)
2.注册中心Eureka
Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。
服务器将自己的信息(IP、端口号、服务类) 提供给注册中心,然后每个服务器将所有存在注册中心的注册信息保存一份在自己服务器中,从而实现服务器之间的交流
3. 分布式项目搭建
在一个分布式项目中,通常会采用父项目和子项目的方式来进行模块化开发和管理。父项目用于管理整个项目的共享依赖和配置,而子项目则代表着项目的不同模块或子系统。
3.1 创建父项目
可以删除父项目中的src,父项目不需要写代码
在父项目pom.xml中指定打包方式为pom
<packaging>pom</packaging>
3.2 创建子项目
子项目pom.xml中指定父项目
<parent>
<artifactId>springcloud-teach</artifactId>
<groupId>com.luobei</groupId>
<version>1.0</version>
</parent>
父项目pom.xml中指定子项目
<modules>
<module>eureka-server</module>
</modules>
配置yml配置文件
server:
port: 8081
spring:
application:
name: goods #微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #向这个接口注册
instance:
instance-id: goods-8081 #指定当前微服务在注册中心中的id
主启动类上开启 @EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3.2.1 创建注册中心
注册中心其实就是一个特殊的子项目,除yml配置不同,其他与别的子项目一致
server:
port: 8761
spring:
application:
name: eureka-server #微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #是否将当前服务器注册到注册中心
fetch-registry: false #是否将注册列表的信息拉取到本地
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}
#注册中心的接口,其他微服务器通过该接口进行注册
主启动类上开启@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.微服务调接口
在微服务架构中,服务之间的通信是通过调用接口来实现的。这些接口可以是 RESTful API、gRPC、消息队列等方式实现的。
4.1 RestTemplate(仅了解)
属于SpringBoot
缺点:put、delete请求得不到返回的结果,使用、维护不方便
4.2 openfeign
OpenFeign 是一个基于 Java 的声明式 HTTP 客户端,通常用于微服务架构中不同服务之间的接口调用。它允许开发者通过注解的方式定义接口,然后由 OpenFeign 自动生成具体的实现。这样可以简化服务之间的通信,让接口调用看起来更像是本地方法调用。
4.2.1 导入依赖
父项目:
<dependencyManagement>
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
公共模块:
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
子项目:
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
4.2.2 编写接口
若接口将会被多个微服务调用则写在commons中
@FeignClient(name="GOODS",path="/goods")
public interface FeignGoodsService {
@PutMapping("/updateStock")
ResponseResult<List<Goods>> del(@RequestBody List<OrderGoodsVo> orderGoodsVoList);
}
@FeignClient(name = "GOODS",path = "/goods") 中name为被调用微服务的名字,path为路径前缀,将要调用的接口方法的声明、请求方式全部拷贝过来
4.2.3 使用接口
在需要使用接口的微服务的主启动类上扫描feign接口
@EnableFeignClients(basePackages = "com.luobei.commons.service")
然后在需要使用的地方注入就行了
@Resource
private FeignGoodsService feignGoodsService;
@Override
public OrderVo add(Integer uid, AddOrderVo orderVo) throws OutOffStockException {
ResponseResult<List<Goods>> del = feignGoodsService.del(Arrays.asList(orderGoodsVo));
return del;
}