【SpringCloud微服务实践】提供与消费

这篇具有很好参考价值的文章主要介绍了【SpringCloud微服务实践】提供与消费。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提供与消费

微服务属于分布式系统,微服务之间通过网络通信,服务之间的关系可以有很多种,其中一种是服务-消费。
比如购票时,用户直接调用的是购票微服务,而购票微服务需要调用用户微服务来获取用户信息以及余额信息等等,在这个场景下,用户微服务是服务提供者,电影微服务是一个服务消费者。

创建服务提供者

以上面的情景为例,创建一个用户微服务。

初始化项目

Spring Initialzr 创建一个Springboot项目(本文是2.7.10版本),预装 Springboot Web, lombok, Mysql Driver, Mybatis Framework四个工具包。

项目配置

  • 在MYSQL中创建一个micro-example1数据库
# MySQL  
# 驱动  
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  
# 数据库名  
spring.datasource.name=defaultDataSource  
# 数据库连接  
spring.datasource.url=jdbc:mysql://localhost:3306/micro-example1?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT  
# 用户名密码  
spring.datasource.username=root  
spring.datasource.password=root  
# 数据初始化  
spring.sql.init.schema-locations=classpath:db/schema.sql  
spring.sql.init.data-locations=classpath:db/data.sql  
spring.sql.init.mode=always  
  
server.port=8081  
  
spring.application.name=user-service
  • schema.sql(resources目录下新建db目录)
DROP TABLE IF EXISTS `user`;  
CREATE TABLE user (  
    `id` INTEGER AUTO_INCREMENT,  
    `username` VARCHAR(40),  
    `name` VARCHAR(20),  
    `age` INTEGER(3),  
    `balance` DECIMAL(10,2) COMMENT '余额',  
    PRIMARY KEY (`id`)  
);
  • data.sql
INSERT INTO user VALUES (1, 'user1', '用户1', 21, 100.00);  
INSERT INTO user VALUES (2, 'user2', '用户2', 22, 200.00);  
INSERT INTO user VALUES (3, 'user3', '用户3', 23, 300.00);

定义User

import lombok.AllArgsConstructor;  
import lombok.Data;  
import lombok.NoArgsConstructor;  
  
import java.math.BigDecimal;  
  
@Data  
@AllArgsConstructor  
@NoArgsConstructor  
public class User {  
	private Integer id;  
	private String username;  
	private String name;  
	private Integer age;  
	private BigDecimal balance;  
}

编写UserMapper

定义一个根据id查询user记录的方法

import com.evanpatchouli.example1.model.User;  
import org.apache.ibatis.annotations.Mapper;  
import org.apache.ibatis.annotations.Select;  
import org.springframework.stereotype.Repository;  
  
@Mapper  
@Repository  
public interface UserMapper {  
  
@Select("select * from user where id=#{id}")  
	User selById(Integer id);  
}

编写Service层

  • UserSerice接口
import com.evanpatchouli.example1.model.User;  
  
public interface UserService {  
	User selById(Integer id);  
}
  • UserServiceImpl实现
import com.evanpatchouli.example1.mapper.UserMapper;  
import com.evanpatchouli.example1.model.User;  
import org.springframework.stereotype.Service;  
  
import javax.annotation.Resource;  
  
@Service  
public class UserServiceImpl implements UserService{  
  
	@Resource  
	private UserMapper userMapper;  
	@Override  
	public User selById(Integer id) {  
		return userMapper.selById(id);  
	}  
}

定义api接口返回格式

  • Result.java
import lombok.AllArgsConstructor;  
import lombok.Data;  
import lombok.NoArgsConstructor;  
  
@AllArgsConstructor  
@NoArgsConstructor  
@Data  
public class Result<T> {  
	int code;  
	String msg;  
	T data;  
}
  • Resp.java(工具类)
public class Resp {  
  
	public static <T> Result ok(String msg, T data) {  
		return new Result(200,msg,data);  
	}  
	  
	public static <T> Result fail(String msg, T data) {  
		return new Result(200,msg,data);  
	}  
}

编写Controller层

import com.evanpatchouli.example1.model.Result;  
import com.evanpatchouli.example1.model.User;  
import com.evanpatchouli.example1.service.UserService;  
import org.springframework.web.bind.annotation.*;  
  
import javax.annotation.Resource;  
  
@RestController  
@CrossOrigin  
@RequestMapping("/user")  
public class UserController<T> {  
	@Resource  
	private UserService userService;  
	  
	@GetMapping("/{id}")  
	public Result<User> findById(@PathVariable Integer id) {  
		User user = userService.selById(id);  
		return new Result<>(200, "查找成功", user);  
	}  
  
}

创建服务消费者

这里创建电影票微服务,准备工作类似,只安装Springboot Web和lombok即可。

配置User服务的地址

写在配置文件里的意图是便于管理和更改地址

server.port=8080
spring.application.name=ticket-service
api.user-service=http://127.0.0.1:8081/user/

创建RestTemplate Bean

入口类内创建一个创建RestTemplate的Bean,作为rest-api客户端

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class TicketApplication {

    @Bean
    public RestTemplate rest() {
        return new RestTemplate();
    }

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

}

创建UserApi

创建一个UserApi组件,使用rest客户端调用user服务的查询接口

import com.example.ticket.model.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@Component
public class UserApi {
    @Value("${api.user-service}")
    private String baseUrl;

    @Resource
    private RestTemplate rest;

    public Result findUserById(Integer id) {
        //http://localhost:8081/user/:id
        return rest.getForObject(baseUrl+id, Result.class);
    }
}

编写Controller层

定义一个查询能不能买下票的接口,传入2参数,票价和用户id。在接口内调用UserApi查询用户信息,进行一系列的判断(用户存在?余额充足?),最后返回结果

import com.example.ticket.api.UserApi;
import com.example.ticket.model.Resp;
import com.example.ticket.model.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;

@RestController
@CrossOrigin
@RequestMapping("/ticket")
public class TicketController {
    @Resource
    private UserApi userApi;

    @GetMapping("/canibuy")
    public Result canIBuy(@RequestParam Double price, @RequestParam Integer id) {
        Result resp = userApi.findUserById(id);
        HashMap user = (HashMap) resp.getData();
        if (user==null){
            return Resp.fail("用户不存在",user);
        }
        if (price.compareTo((Double) user.get("balance")) > 0){
            return Resp.fail("余额不足",user);
        }
        return Resp.ok("余额充足", user);
    }
}

总结

这是一个最简单的微服务之间的调用,甚至都用不上SpringCloud,但很简洁得为我们展示了服务提供者和消费者之间的关系。文章来源地址https://www.toymoban.com/news/detail-461806.html

到了这里,关于【SpringCloud微服务实践】提供与消费的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest。 一、ribbon简介 Ribbon is a clien

    2024年02月11日
    浏览(29)
  • SpringCloud微服务实战——搭建企业级开发框架:微服务安全加固—自定义Gateway拦截器实现防止SQL注入/XSS攻击

     SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删改查等操作。   XSS全称为Cross Site Script跨站点脚本攻击,和SQL注入类似,都是通过特定方

    2024年02月03日
    浏览(56)
  • 记一次dubbo消费者注册失败找不到服务提供者问题

    项目分多套环境,其中一套环境重新部署时,频繁出现消费者找不到服务提供者的错误 经过多次重启后才有可能恢复正常,而其他环境并没有发现此问题 怀疑点: 1.消费者和服务提供者dubbo版本对不上 2.服务提供者没有注册上服务 3.注册中心有问题 逐一排查: 1.消费者和服

    2023年04月18日
    浏览(35)
  • SpringCloud(5)— 微服务部署(Docker)

    1.项目部署问题 大型项目组件较多,运行环境较为复杂,部署和维护困难 依赖关系复杂,容易出现兼容性问题 开发,测试,生产环境有差异 2.解决依赖的兼容问题 将应用的Libs(函数库),Deps(依赖),配置与应用一起打包 将每个应用放到一个单独的容器中去运行,避免相互干

    2024年01月20日
    浏览(62)
  • SpringCloud | Dubbo 微服务实战——注册中心详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家 :https://www.captainbed.cn/z chatgpt体验地址 在项目开发过程中,随着项目不断扩大,也就是业务的不断增多,我们将采用集群,微服务的形式去降低配置,集群是指将一个项目部署到多个服

    2024年02月05日
    浏览(32)
  • 【云计算学习教程】用户如何使用云服务产品?_云服务消费者从云服务提供商或者云服务代理商那里租赁云服务产品在合同期内和

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新大数据全套学习资料》,

    2024年04月25日
    浏览(42)
  • SpringCloud Gateway 在微服务架构下的最佳实践

    作者:徐靖峰(岛风) 本文整理自云原生技术实践营广州站 Meetup 的分享,其中的经验来自于我们团队开发的阿里云 CSB 2.0 这款产品,其基于开源 SpringCloud Gateway 开发,在完全兼容开源用法的前提下,做了诸多企业级的改造,涉及功能特性、稳定性、安全、性能等方面。 从功

    2024年02月14日
    浏览(38)
  • 链路追踪在开源SpringBoot/SpringCloud微服务框架的实践

    前期内容导读: Java开源RSA/AES/SHA1/PGP/SM2/SM3/SM4加密算法介绍 Java开源AES/SM4/3DES对称加密算法介绍及其实现 Java开源AES/SM4/3DES对称加密算法的验证说明 Java开源RSA/SM2非对称加密算法对比介绍 Java开源RSA非对称加密算法实现 Java开源SM2非对称加密算法实现 Java开源接口微服务代码框架

    2024年02月09日
    浏览(41)
  • 异常处理在开源SpringBoot/SpringCloud微服务框架的最佳实践

    前期内容导读: Java开源RSA/AES/SHA1/PGP/SM2/SM3/SM4加密算法介绍 Java开源AES/SM4/3DES对称加密算法介绍及其实现 Java开源AES/SM4/3DES对称加密算法的验证说明 Java开源RSA/SM2非对称加密算法对比介绍 Java开源RSA非对称加密算法实现 Java开源SM2非对称加密算法实现 Java开源接口微服务代码框架

    2024年02月12日
    浏览(53)
  • 加解密在开源SpringBoot/SpringCloud微服务框架的最佳实践

    前期内容导读: Java开源RSA/AES/SHA1/PGP/SM2/SM3/SM4加密算法介绍 Java开源AES/SM4/3DES对称加密算法介绍及其实现 Java开源AES/SM4/3DES对称加密算法的验证说明 Java开源RSA/SM2非对称加密算法对比介绍 Java开源RSA非对称加密算法实现 Java开源SM2非对称加密算法实现 Java开源接口微服务代码框架

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包