微服务使用到了我们的多模块开发,父级工程可以在modules管理子模块
子模块中也会定义父模块
1. Nacos注册中心
Nacos已成为Java微服务生态的事实标准组件,在2023年中国Java开发者调研中占比达62%。其优势在于将服务发现与配置管理统一,显著降低运维复杂度。建议新项目直接采用Nacos 2.0+版本(性能提升50%),对于历史Eureka系统可参考阿里云提供的迁移工具
双重角色
服务注册中心(替代Eureka)
动态配置中心(替代Spring Cloud Config)
阿里巴巴开源,支持K8s原生服务发现
1.1 启动nacos
打开nacos文件路径下bin目录,cmd命令(startup.cmd -m standalone)运行nacos
启动之后通过服务网址(http://localhost:8848/nacos/index.html)进行访问
1.2 将项目注册到Nacos
父工程导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在子模块添加nacos依赖
<!-- nacos核心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改子模块的application.yml配置
server:
port: 8080
spring:
cloud:
nacos:
server-addr: localhost:8848 # Nacos服务地址(包括IP和端口)
discovery:
# Nacos认证信息,用于注册与发现服务
username: nacos
password: nacos
application:
name: orderservice # 当前应用的服务名称,在Nacos中注册使用
datasource:
url: jdbc:mysql://localhost:3306/cloud-order?useSSL=false&allowPublicKeyRetrieval=true # 数据库连接URL配置
username: root # 数据库登录用户名
password: 1234 # 数据库登录密码
driver-class-name: com.mysql.cj.jdbc.Driver # JDBC驱动类名
mybatis:
type-aliases-package: com.itgaohe.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.itgaohe: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
重启服务,查看nacos服务官网,就会有服务
2. feign 远程调用
声明式HTTP客户端,将REST调用抽象为Java接口调用,实现远程调用本地化。
(属于Spring Cloud Netflix组件,现为OpenFeign)
集成点 | 实现方式 | 示例配置 |
负载均衡 | 自动装配Ribbon/LoadBalancer | @LoadBalanced |
服务发现 | 对接Nacos/Eureka | spring.cloud.nacos.discovery |
熔断降级 | 支持Hystrix/Sentinel | feign.circuitbreaker.enabled=true |
这里有一个服务提供者和服务消费者模块,想要实现服务生产者调用服务消费者
我们使用多模块开发来实现Feign远程调用案例,步骤如下:
2.1 创建feign-api,导入Feign依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.itgaohe</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>feign-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--bootstrap依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2.2 feign-api模块
在feign-api下将服务提供者orderserver下的相关包复制到feign-api项目中
- feign启动类
package com.itgaohe.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
- FeignClients
接口层,定义接口
package com.itgaohe.feign.clients;
import com.itgaohe.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* Feign客户端接口,用于调用用户服务
*/
@FeignClient(name = "userservice") // 指定要调用的服务名称
public interface UserClients {
/**
* 根据用户ID查询用户信息
* @param id 用户ID
* @return 返回对应的用户对象
*/
@GetMapping("/{id}") // 定义GET请求映射路径
public User queryById(@PathVariable("id") Long id); // 通过路径变量传递用户ID
}
@FeignClient注解name跟的一定是要调用的服务名称
2.3 在服务提供者pom文件中引入feign-api依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.itgaohe</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.itgaohe</groupId>
<artifactId>feign-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--bootstrap依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--bootstrap依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.itgaohe</groupId>
<artifactId>user-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2.4 在服务消费者启动类添加注解,启动Feign服务
这样就可以进行调用了~