作者:UJXo小妖春日望美 | 来源:互联网 | 2023-09-12 15:16
SpringCloud框架搭建的项目如何实现一个模块调用另一个模块的服务简介准备注意:注意注意:运行项目就可以完成跨服务调用了,(被调用的服务模块也要启动)简介基于SpringCl
SpringCloud框架搭建的项目如何实现一个模块调用另一个模块的服务
- 简介
- 准备
- 注意:
- 注意
- 注意:运行项目就可以完成跨服务调用了,(被调用的服务模块也要启动)
简介
基于SpringCloud框架搭建的项目,不同模块之间是无法调用各自的服务的,但是经常我们需要使用这样的模式去开发,那么如何实现不同模块之间的服务调用呢?
准备
1.在需要调用其他模块服务的项目中创建一个package包,里面定义三个类,如下图
MemberClient可以随意命名,但是下面的两个尽量保持一致,其中三个类的代码分别是:
MemberClient:
package com.yuwan.qiniuvideo.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name="member")//book 是service id指明调用的是book这个服务里的接口,再往后所有有关book服务的接口调用都在这里面写
/*Feign 默认就有支持Ribbon 负载均衡,我们只需要不熟多个book微服务就可以了,客户端可以自动轮询选择调用*/
public interface MemberClient {
@GetMapping("/selectMemberInfo")
public RestResult getInfo(@RequestParam("id") Long id);
//如果是 postmapping 的话接受参数 就是用@Requestbody 用map 接参 (@Requestbody Map reqest)
}
注意:
此时发现@FeignClient(name=“member”)中的@FeignClient注解爆红,那是因为没有导入jar包,导入如下jar包即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在MemberClient类中的@FeignClient(name=“member”),name属性对应的值就是被调用服务所在的模块,例如本文档是video模块调用member模块的服务,故name属性对应的是member,类中的@GetMapping(&#8220;/selectMemberInfo&#8221;)对应的就是被调用模块中的服务路径(服务的路径暴露在controller层即可),可以按照自己的要求去书写此服务内容。
MemberDTO:
package com.yuwan.qiniuvideo.client;
import java.math.BigDecimal;
public class MemberDTO {
private Long id;
private Long sn;
private String author;
private String publishing;
private BigDecimal bprice;
private BigDecimal sprice;
private String btype;
private Integer stock;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getSn() {
return sn;
}
public void setSn(Long sn) {
this.sn = sn;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishing() {
return publishing;
}
public void setPublishing(String publishing) {
this.publishing = publishing;
}
public BigDecimal getBprice() {
return bprice;
}
public void setBprice(BigDecimal bprice) {
this.bprice = bprice;
}
public BigDecimal getSprice() {
return sprice;
}
public void setSprice(BigDecimal sprice) {
this.sprice = sprice;
}
public String getBtype() {
return btype;
}
public void setBtype(String btype) {
this.btype = btype;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
}
RestResult:
package com.yuwan.qiniuvideo.client;
public class RestResult {
private String code;
private String message;
private MemberDTO data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MemberDTO getData() {
return data;
}
public void setData(MemberDTO data) {
this.data = data;
}
}
做完这些准备之后,就是调用服务,首先在调用服务的地方注入MemberClient ,例如:
@Resource
private MemberClient memberClient;
然后调用MemberClient 类中的方法getInfo(),这个过程就和SSM框架的调用流程是一样的了
RestResult info = memberClient.getInfo(memberId);
if(info.getCode()!="200") {
result.setFlag(false);
result.setMsg("用户不存在");
return result;
}
注意
此时并没有结束,在SpringBoot项目的引导类中需要初始化服务
package com.yuwan.qiniuvideo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//弃用Feign客户端
public class VideoApplication {
@Bean
@LoadBalanced//对restTemplate进行负载均衡
public RestTemplate restTemplate () {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(VideoApplication.class, args);
}
}
这里的@EnableFeignClients//弃用Feign客户端
@EnableFeignClients//弃用Feign客户端
和
@Bean
@LoadBalanced//对restTemplate进行负载均衡
public RestTemplate restTemplate () {
return new RestTemplate();
}
就是初始化的作用。
注意:运行项目就可以完成跨服务调用了,(被调用的服务模块也要启动)