Spring Cloud与微服务之商品微服务

比眉伴天荒 2022-04-05 12:27 454阅读 0赞

文章目录

  • 微服务间的调用场景
  • 项目结构
    • springcloud-goods-item项目结构
    • springcloud-goods-item2项目结构
  • 源码
    • springcloud-goods-item源码
    • springcloud-goods-item2部分源码
  • 结果分析
    • 查看Eureka中的服务注册信息
    • 请求商品条目信息

微服务间的调用场景

  在使用Spring Cloud微服务时,经常会用到微服务模块间的调用场景。

  比如说我们这里有两个微服务,其一是商品微服务;其二是订单微服务,此时我们想要查询订单微服务中的信息时,订单微服务就会向商品微服务中请求对应的商品条目信息,于是就出现了微服务间的调用场景。

项目结构

springcloud-goods-item项目结构

在这里插入图片描述

springcloud-goods-item2项目结构

在这里插入图片描述

源码

springcloud-goods-item源码

  JdbcConfigBean源码:

  1. package com.lyc.configBean;
  2. import lombok.*;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.cloud.context.config.annotation.RefreshScope;
  5. import org.springframework.stereotype.Component;
  6. @Getter
  7. @Setter
  8. @Builder
  9. @ToString
  10. @NoArgsConstructor
  11. @AllArgsConstructor
  12. @Component //加入到Spring容器
  13. @RefreshScope
  14. public class JdbcConfigBean {
  15. @Value("${jdbc.url}")
  16. private String url;
  17. @Value("${jdbc.username}")
  18. private String username;
  19. @Value("${jdbc.password}")
  20. private String password;
  21. @Value("${jdbc.driverClassName}")
  22. private String driverClassName;
  23. }

  ItemController源码:

  1. package com.lyc.controller;
  2. import com.lyc.configBean.JdbcConfigBean;
  3. import com.lyc.item.entity.Item;
  4. import com.lyc.service.ItemService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RestController;
  10. @Slf4j
  11. @RestController
  12. public class ItemController {
  13. @Autowired
  14. private ItemService itemService;
  15. @Autowired
  16. private JdbcConfigBean jdbcConfigBean;
  17. @GetMapping("/item/{id}")
  18. public Item queryItemById(@PathVariable("id") Long id){
  19. log.info("----------springcloud-goods-item中的方法----------");
  20. return this.itemService.queryItemById(id);
  21. }
  22. @GetMapping(value = "test")
  23. public String test(){
  24. return this.jdbcConfigBean.toString();
  25. }
  26. }

  ItemService源码:

  1. package com.lyc.service;
  2. import com.lyc.item.dao.ItemDao;
  3. import com.lyc.item.entity.Item;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. @Service
  7. public class ItemService {
  8. @Autowired
  9. ItemDao itemDao;
  10. /** * 模拟实现商品查询 * @param id * @return */
  11. public Item queryItemById(Long id){
  12. return itemDao.queryItemById(id);
  13. }
  14. }

  ItemApplication源码:

  1. package com.lyc;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @EnableEurekaServer //申明这是一个Eureka服务
  6. @SpringBootApplication //申明这是一个Spring Boot项目
  7. public class ItemApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ItemApplication.class,args);
  10. }
  11. }

  application.yml源码:

  1. server:
  2. port: 8081 #服务端口
  3. spring:
  4. application:
  5. name: springcloud-goods-item #指定服务名
  6. eureka:
  7. client:
  8. registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
  9. fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
  10. serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
  11. defaultZone: http://root:root123@127.0.0.1:6868/eureka/,http://root:root123@127.0.0.1:6869/eureka/
  12. instance:
  13. prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
  14. ip-address: 127.0.0.1
  15. instance-id: ${spring.application.name}:${server.port} #指定实例id
  16. management:
  17. security:
  18. enabled: false #是否开启安全认证

  bootstrap.yml源码:

  1. eureka:
  2. client:
  3. serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
  4. defaultZone: http://root:root123@127.0.0.1:6868/eureka/
  5. spring:
  6. cloud:
  7. config:
  8. name: microservice
  9. #uri: http://127.0.0.1:6688/ #对应配置服务中的应用名称
  10. profile: dev #对应配置服务中的{profile}
  11. label: master #对应的分支
  12. discovery:
  13. enabled: true #启用发现服务功能
  14. service-id: springcloud-config-server #指定服务名称
  15. rabbitmq: #RabbitQM相关的配置
  16. host: 127.0.0.1
  17. port: 5672
  18. username: guest
  19. password: guest

  pom.xml源码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <artifactId>springcloud-parent</artifactId>
  6. <groupId>com.lyc</groupId>
  7. <version>1.0-RELEASE</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springcloud-goods-item</artifactId>
  11. <packaging>jar</packaging>
  12. <name>SpringCloud微服务::商品服务1</name>
  13. <url>http://www.example.com</url>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. </properties>
  17. <!--导入SpringCloud的依赖管理-->
  18. <dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-dependencies</artifactId>
  23. <version>Dalston.SR3</version>
  24. <type>pom</type>
  25. <scope>import</scope>
  26. </dependency>
  27. </dependencies>
  28. </dependencyManagement>
  29. <dependencies>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-web</artifactId>
  33. </dependency>
  34. <!--导入Eureka服务的依赖-->
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  38. </dependency>
  39. <!-- 添加config client依赖 -->
  40. <dependency>
  41. <groupId>org.springframework.cloud</groupId>
  42. <artifactId>spring-cloud-starter-config</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-actuator</artifactId>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>com.lyc</groupId>
  54. <artifactId>springcloud-goods-db</artifactId>
  55. </dependency>
  56. </dependencies>
  57. <build>
  58. <finalName>${project.artifactId}</finalName>
  59. </build>
  60. </project>

springcloud-goods-item2部分源码

  由于模拟分布式的要求,因而这里创建了两个springcloud-goods-item,其中第二个被命名为springcloud-goods-item2,他们中的大部分代码都是相同的,所以说这里仅仅是贴出其中的不同部分。

  • 由ItemApplication变更为Item2Application。
  • application.yml中的端口号由8081变更为8083
  • pom.xml中的名称也做类似的修改。

结果分析

查看Eureka中的服务注册信息

  同时启动springcloud-goods-item与springcloud-goods-item2,由于我们在项目的application.yml中已经配置了将自身注册到Eureka以及从Eureka中获取服务,因而我们可以在Eureka中查看到相应的服务注册项。

在这里插入图片描述

  由于我们两个项目中的application.yml配置的服务名都是如下配置

  1. spring:
  2. application:
  3. name: springcloud-goods-item #指定服务名

  因而我们可以在Eureka中看到两个相同的服务名:springcloud-goods-item

请求商品条目信息

  假如说我们要访问springcloud-goods-item中的商品条目,我们可以这么写:

  1. http://127.0.0.1:8081/item/1

  其请求的结果如下:

在这里插入图片描述

  从上面的结果中,我们可以看到,我们成功的查询出了自己想要的数据。

  其中这里的商品信息就是从springcloud-goods-db中取出来的,而由于我们的springcloud-goods-item本身没有商品实体类Item,而该实体类是存放到统一的springcloud-goods-db中,我们在springcloud-goods-item中通过如下方式引入的springcloud-goods-db。

  1. <dependency>
  2. <groupId>com.lyc</groupId>
  3. <artifactId>springcloud-goods-db</artifactId>
  4. </dependency>

  而由于在springcloud-goods-db中我们通过@Component将ItemDao类声明为一个组件,因而我们在springcloud-goods-item的ItemService类中,通过如下方式注入:

  1. @Autowired
  2. ItemDao itemDao;

  这样我们就可以在ItemService中正常的使用ItemDao中的方法了,当然,如果将其换成Mybatis,其原理也是一样的。

发表评论

表情:
评论列表 (有 0 条评论,454人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务Spring Cloud

    微服务与Spring Cloud   要想搭建一套微服务架构需要考虑如下几个问题: 1、微服务之间的通信协议,需要使用同一的通信协议; 2、网络拥塞与延迟,一个请求跨多