SpringCloud框架搭建的项目如何实现一个模块调用另一个模块的服务

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("/selectMemberInfo")对应的就是被调用模块中的服务路径(服务的路径暴露在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();
	}

就是初始化的作用。

注意:运行项目就可以完成跨服务调用了,(被调用的服务模块也要启动)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值