4.6 搭建服务消费者
- 服务消费者即客户端,工程整体结构
- 在父工程 spring-cloud-microservice下,创建一个名为 microservice-cloud-consumer-dept-80 的微服务(Spring Boot Module),并在其 pom.xml 中引入所需的依赖,代码如下。
- 80是http默认端口号且消费者不应该有service层,只要在controller中获取到provider的请求地址即可访问服务
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--引入父工程pom-->
<parent>
<artifactId>spring-cloud-microservice</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>microservice-cloud-consumer-dept-80</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microservice-cloud-consumer-dept-80</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--消费者只要实体类API+web-->
<dependencies>
<!--引入公共子模块-->
<dependency>
<groupId>org.example</groupId>
<artifactId>microservice-cloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--devtools 开发工具 这个热部署重启得更快-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--logback -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--springboot-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在类路径(即 /resource 目录)下,新建一个配置文件 application.yml,配置内容如下
server:
port: 80
- 在 com.example.config 包下,创建一个名为 ConfigBean 的配置类,将 RestTemplate 注入到容器中,代码如下。
RestTemplate 是一种简单便捷的访问 restful 服务模板类,是 Spring 提供的用于访问 Rest 服务的客户端模板工具集,提供了多种便捷访问远程 HTTP 服务的方法
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
restTemplate已经简化了底层通信的方法,只是为了高效开发才有了Feign这样的组件
- 在com.example.controller下创建一个名为 DeptConsumerController的 Controller,该 Controller 中定义的请求用于调用服务端提供的服务,代码如下。
package com.example.controller;
import com.zk.springcloud.entity.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class DeptConsumerController {
//这种方式是直调用服务方的方法,根本没有用到 Spring Cloud
private static final String REST_URL_PROVIDER_PREFIX = "http://localhost:8001";
//RestTemplate 是一种简单便捷的访问 restful 服务模板类,是 Spring 提供的用于访问 Rest 服务的客户端模板工具集,提供了多种便捷访问远程 HTTP 服务的方法
// 消费者不应该有service层,只要在controller中获取到provider的请求地址即可访问服务
//RestTemplate....供我们直接调用就可以了!注册到spring中
//(String url, Class<T> responseType, Map<String, ?> uriVariables)亲求实体
@Autowired
private RestTemplate template;
//不同于rpc那种DubboReference引用服务提供者的service,rpc是 接口调用 通过 反射
//获取指定部门信息
@GetMapping("/consumer/dept/get/{id}")
public Dept getDeptById(@PathVariable("id") Integer id){
return template.getForObject(REST_URL_PROVIDER_PREFIX+"/dept/get/"+id,Dept.class);
}
//获取部门列表
@GetMapping("/consumer/dept/list")
public List<Dept> getDepts(){
return template.getForObject(REST_URL_PROVIDER_PREFIX+"/dept/list",List.class);
}
@RequestMapping("/consumer/dept/add")
public boolean addDept(Dept dept){
return template.postForObject(REST_URL_PROVIDER_PREFIX+"/dept/add",dept,Boolean.class);
}
}
在消费者中通过http访问其他微服务的控制层,这样完成多服务器服务解耦(因为可以更换访问路径)
参数可以通过3中方式传输,一种是分装成map,一种是实体类,另一种是在url路径携带
-
测试,先启动服务提供者的启动类,然后在启动服务消费者的启动类
-
访问http://127.0.0.1/consumer/dept/list测试结果
- 访问http://127.0.0.1/consumer/dept/get/1测试结果,说明服务消费者运行正常
- 注意:在服务提供者项目中使用http://127.0.0.1:8001/dept/add?deptName=销售部是无法添加进去的,而在消费者项目中使用了rest风格的请求则可以添加成功
下一篇:SpringCloud-6-pom文件中常用的标签
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123823.html