本文介绍如何使用 springboot3及cloud2023 进行微服务模块化开发
采用父-module 模块开发
父工程 demo-java
pom.xml
<!--配置 springboot的依赖的版本号, 方便 module 进行继承--> <dependencyManagement> <dependencies> <!--增加 springboot的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.5</version> <type>pom</type> <scope>import</scope> </dependency> <!--增加 springcloud的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2023.0.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
子模块 cloud-eureka-server-7001
pom.xml
<dependencies> <!--增加 boot web的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--增加 eureka-server 的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
启动类:
package com.ly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class CloudEurekaServer7001 { public static void main(String[] args) { SpringApplication.run(CloudEurekaServer7001.class,args); } }
配置文件 application.yml
# 设置端口号为 7001 server: port: 7001 eureka: instance: hostname: localhost client: fetch-registry: false #如果fetch-registry为false, 则表示自己为注册中心 register-with-eureka: false #表示是否向eureka注册中心注册自己 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 服务地址
启动测试:
子模块 cloud-eureka-provider-8001
pom.xml
<dependencies> <!--增加 boot web的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--增加 eureka client 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--增加 监控 boot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
启动类
package com.ly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class EurekaProvider8001 { public static void main(String[] args) { SpringApplication.run(EurekaProvider8001.class,args); } }
application.yaml
#设置端口号 server: port: 8001 eureka: client: fetch-registry: true #是提供者,不是注册中心 ,可省略 register-with-eureka: true #向注册中心 注册服务,可省略 service-url: #服务地址 defaultZone: http://localhost:7001/eureka
刷新 之前的 server
如何 解决 unknow ?修改 provider-8001 的 yaml文件,增加 spring.application.name
为了 模拟 用户管理 ---provider8001 , 订单管理--provider8002, 消费者来 消费服务
子模块 cloud-eureka-common-api
pom.xml
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
创建 实体层 User.java 与 OrderInfo.java
package com.ly.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** * 用户 实体 */ @Data @AllArgsConstructor @NoArgsConstructor @ToString public class User { private int userId; //用户编号 private String username;//用户名 private String phone;//电话 }
package com.ly.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import java.time.LocalDateTime; /** * 订单 实体 */ @Data @AllArgsConstructor @NoArgsConstructor @ToString public class OrderInfo { private int orderNo;//订单编号 private String title;// 标题 private double price;//单价 private double count;//个数 private LocalDateTime time;//购买时间 private int userId;// 用户编号 }
修改 provider8001 的 pom.xml
增加
<!--引入 common-api module--> <dependency> <groupId>com.ly</groupId> <artifactId>cloud-eureka-common-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
为 provider8001 增加 controller
package com.ly.controller; import com.ly.entity.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; /** * provider8001 --模拟的就是用户管理 模块 */ @RestController public class UserController { @GetMapping("/user/{id}") public User find(@PathVariable("id")int id){ // 模拟数据返回 return new User(1001,"李四","137526154875"); } }
启动 provider8001 进行测试
看到以上 截图表示 成功
子模块 eureka-provider-8002
pom.xml
<dependencies> <!--增加 boot web的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--增加 eureka client 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--增加 监控 boot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--引入 common-api module--> <dependency> <groupId>com.ly</groupId> <artifactId>cloud-eureka-common-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
application.yaml
#设置端口号 server: port: 8002 eureka: client: fetch-registry: true #是提供者,不是注册中心 ,可省略 register-with-eureka: true #向注册中心 注册服务,可省略 service-url: #服务地址 defaultZone: http://localhost:7001/eureka spring: application: name: provider-8002 # 设置应用名, 注意, 值 不允许使用 下划线
启动类
package com.ly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class EurekaProvider8002 { public static void main(String[] args) { SpringApplication.run(EurekaProvider8002.class,args); } }
controller
package com.ly.controller; import com.ly.entity.OrderInfo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; /** * provider8002 模拟就是 订单管理 模块 */ @RestController public class OrderInfoController { @GetMapping("/order/{userId}") public OrderInfo find(@PathVariable("userId")int userId){ //模拟数据返回 return new OrderInfo(1003,"保温杯",50,1, LocalDateTime.now(),1001); } }
启动 provider8002, 测试 7001
子模块 cloud-eureka-consumer-80
pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.ly</groupId> <artifactId>cloud-eureka-common-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
启动类
package com; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ConsumerApp80 { public static void main(String[] args) { SpringApplication.run(ConsumerApp80.class,args); } }
配置文件
#设置端口号 server: port: 80 eureka: client: fetch-registry: true #是提供者,不是注册中心 ,可省略 register-with-eureka: false #向注册中心 不注册服务,因此 是消费服务的 service-url: #服务地址 defaultZone: http://localhost:7001/eureka spring: application: name: consumer80 # 设置应用名, 注意, 值 不允许使用 下划线
配置类 注入 RestTemplate
package com; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * 配置类 */ @Configuration public class MyConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
controller
package com.controller; import com.ly.entity.OrderInfo; import com.ly.entity.User; 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 org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; /** * 模拟查询 用户信息 * @param id * @return */ @GetMapping("/user/{id}") public User queryUser(@PathVariable("id")int id){ //访问 8001 获得 数据 return restTemplate.getForObject("http://localhost:8001/user/1",User.class); } /** * 模糊查询订单 * @param id * @return */ @GetMapping("/order/{id}") public OrderInfo queryOrder(@PathVariable("id")int id){ //访问 8002 获得数据 return restTemplate.getForObject("http://localhost:8002/order/3",OrderInfo.class); } }
启动 consumer 进行 测试