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

微服务间的调用场景

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

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

项目结构

springcloud-goods-item项目结构

在这里插入图片描述

springcloud-goods-item2项目结构

在这里插入图片描述

源码

springcloud-goods-item源码

  JdbcConfigBean源码:


package com.lyc.configBean;

import lombok.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Component  //加入到Spring容器
@RefreshScope
public class JdbcConfigBean {

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

}

  ItemController源码:


package com.lyc.controller;

import com.lyc.configBean.JdbcConfigBean;
import com.lyc.item.entity.Item;
import com.lyc.service.ItemService;
import lombok.extern.slf4j.Slf4j;
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;

@Slf4j
@RestController
public class ItemController {

    @Autowired
    private ItemService itemService;
    @Autowired
    private JdbcConfigBean jdbcConfigBean;

    @GetMapping("/item/{id}")
    public Item queryItemById(@PathVariable("id") Long id){
        log.info("----------springcloud-goods-item中的方法----------");
        return this.itemService.queryItemById(id);
    }

    @GetMapping(value = "test")
    public String test(){
        return this.jdbcConfigBean.toString();
    }

}

  ItemService源码:


package com.lyc.service;

import com.lyc.item.dao.ItemDao;
import com.lyc.item.entity.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ItemService {

    @Autowired
    ItemDao itemDao;

    /**
     * 模拟实现商品查询
     * @param id
     * @return
     */
    public Item queryItemById(Long id){
       return itemDao.queryItemById(id);
    }

}

  ItemApplication源码:


package com.lyc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer   //申明这是一个Eureka服务
@SpringBootApplication   //申明这是一个Spring Boot项目
public class ItemApplication {

    public static void main(String[] args) {
        SpringApplication.run(ItemApplication.class,args);
    }

}

  application.yml源码:

server:
  port: 8081  #服务端口

spring:
  application:
    name: springcloud-goods-item  #指定服务名

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
    fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:root123@127.0.0.1:6868/eureka/,http://root:root123@127.0.0.1:6869/eureka/
  instance:
    prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
    ip-address: 127.0.0.1
    instance-id: ${spring.application.name}:${server.port} #指定实例id

management:
  security:
    enabled: false #是否开启安全认证

  bootstrap.yml源码:

eureka:
  client:
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://root:root123@127.0.0.1:6868/eureka/

spring:
  cloud:
    config:
      name: microservice
      #uri: http://127.0.0.1:6688/ #对应配置服务中的应用名称
      profile: dev #对应配置服务中的{profile}
      label: master #对应的分支
      discovery:
        enabled: true #启用发现服务功能
        service-id: springcloud-config-server #指定服务名称

  rabbitmq: #RabbitQM相关的配置
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

  pom.xml源码:

<?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>springcloud-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-goods-item</artifactId>
    <packaging>jar</packaging>

    <name>SpringCloud微服务::商品服务1</name>
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--导入SpringCloud的依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--导入Eureka服务的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 添加config client依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>com.lyc</groupId>
            <artifactId>springcloud-goods-db</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
    </build>

</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配置的服务名都是如下配置

spring:
  application:
    name: springcloud-goods-item  #指定服务名

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

请求商品条目信息

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

http://127.0.0.1:8081/item/1

  其请求的结果如下:

在这里插入图片描述

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

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

<dependency>
    <groupId>com.lyc</groupId>
    <artifactId>springcloud-goods-db</artifactId>
</dependency>

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


@Autowired
ItemDao itemDao;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值