Spring Cloud与微服务之商品微服务
文章目录
- 微服务间的调用场景
- 项目结构
- 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源码:
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,其原理也是一样的。
还没有评论,来说两句吧...