SpringCloud详细教程2-消费者模块

详细学习SpringCloud教程2—消费者模块

每天学习一点点,进步一点点,过段时间回头看看,进步的可不止一点点。


用户模块:承接我们的支付模块,程序是写给用户的,不可能只有支付对吧,还要给用户可用的接口,不可能让用户像开发一样,还得自己写端口号之类的。毕竟软件面向的是大众,而不是特立人群。So 开始吧.

一样的套路,不一样的写法哦。

开始前我们新建一个moudle: cloud-spring-order80(80是什么意思呢?建议可以看看HTTP协议的对80简单介绍哦,80端口是浏览器默认端口,我们不肯让用户来访问时也写一个端口号吧,对吧。)

好了,moudle建好了,老套路:


一、编辑我们的POM.XML。这里就不放POM的代码了,不然会很乱。

二、创建并编辑我们的application.yml:

server:  
	port: 80

三、创建与支付模块对应的实体类,可以直接复制支付模块的两个实体类,这里不一一赘述。

四、由于,order项目是直接面向用户的,用户肯定不能直接去操作service这些业务层的,所以order里面只需要写controller层就可以了,我们只需要吧接口给用户,让用户可以访问想访问的就可以了,用户也不会去管这个功能具体怎么实现,也不会非要去查看源码对吧,除非NZ有问题

五、controller层的书写

既然我们已经不需要写service等业务层了,那么肯定是需要用户微服务来调用支付微服务。那么服务之间怎么调用呢?不急,这就一一道来。

开始前,我们要先了解,RestTemplate当然其他的也可以,这里主要是用RestTemplate。什么是RestTemplate呢?

RestTemplate提供了多种便捷访问远程HTTP服务的方法,是一种简单的访问restful服务模板类,是spring提供的用于访问Rest服务的客户端模板工具集。

详细的可以去官网看看: RestTemplate文档

RestTemplate 的使用:

 (url,requestMap,ResponseBean.class)三个参数分别代表:REST请求地址、请求参数以及请求返回类型

插入小知识:
	有时候我们项目启时会报端口占用。这个时候大多是我们在项目运行时直接关闭了IDEA导致端口号没有注销,一直在占用中。啦啦啦啦,下面是关闭方法:
1. WIN+R,输入cmd 
2. 命令行输入:netstat -aon|findstr "8080" 8080->被占用端口号
3. 界面上会弹出一个列表,列表第一行最后会出现一个数字,请记录下这个数字.
4. 而后输入新的命令,查看端口被哪个程序占用着,tasklist|findstr "11152"(11152->3中记录的数字)
5. 这时我们已经找到占用该端口的凶手了,让我们终结它吧。
6. 输入taskkill /f /t /im java.exe (java.exe->为我们tasklist|findstr "11152",出现的行第一个后缀为.exe的名字。
7. 此时端口号释放。可以正常使用啦

OK,进入正题:

六、在使用RestTemplate时,我们先去创建一个ApplicationContextConfig属性类

@Configuration
public class ApplicationContextConfig {    
    @Bean    
    public RestTemplate getRestTemplate(){        
    	return new RestTemplate();    
    }
}

七、可能会有人说,为什么不直接卸载启动类呢?注意,我们是面向对象编程,你把配置全部放到启动类乱糟糟的。所以单独建立一个config文件夹,放进去不香嘛,以后修改也简单。

Controller层:OrderController

@RestController
@Slf4j
public class OrderController {    
    public static final String PAYMENT_URL = "http://localhost:8001"; 
    //建立连接地址,避免下边复制粘贴
    @Resource    
    private RestTemplate restTemplate;//注入   RestTemplate属性值 
    
    @GetMapping("/consmuer/payment/create") //用户访问的url   
    public CommonResult create(Payment payment){
    System.out.println(payment.toString());        
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class); //创建用   postForObject方法,属性url,参数值,返回类型
    }    
    
    @GetMapping("/consmuer/payment/getPaymentById/{id}")    
    public CommonResult getPaymentById(@PathVariable("id") Long id){       
    	return restTemplate.getForObject(PAYMENT_URL + "/payment/getPaymentById/" + id, CommonResult.class);    
    }
}

此时我们就可以去浏览器测试了哦。Tips:上边代码有一点点问题,希望可以不看下边的提示,可以自己看出来哦。

八、浏览器输入我们用户访问的url :http://localhost//consmuer/payment/getPaymentById/1

{"code":200,"message":"查询数据库成功","data":{"id":1,"serial":"202103041827"}}
我们可以看到,结果正常输出了。

九、输入创建流水号的url:http://localhost//consmuer/payment/create?serial=2021030616491132

此时可以看到啊,唉,报错了

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat Mar 06 16:51:06 CST 2021

There was an unexpected error (type=Internal Server Error, status=500).

500 : [{"timestamp":"2021-03-06T08:51:06.387+0000","status":500,"error":"Internal Server Error","message":"\r\n### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintVio... (739 bytes)]

十、为什么会出现上面这种情况呢?愿意啊出在了我们支付模块的Controller层的传值上了,将支付模块的Controller层的create方法的参数前加上注解:@RequestBody 即可:

@PostMapping(value = "/payment/create")
public CommonResult<Payment> create(@RequestBody Payment payment)

十一、再次输入创建的url:http://localhost//consmuer/payment/create?serial=2021030616491132

{"code":200,"message":"插入数据库成功","data":{"id":7,"serial":"2021030616491132"}}
可以看到啊,数据成功插入了,然后这个时候可以到数据库看一下,数据是否真正插入成功哦!

十二、上述的情况还有另一种,即,支付模块的Controller层的create方法的参数前没有加上注解:@RequestBody,但是提示我们插入数据库成功

{"code":200,"message":"查询数据库成功","data":1}

此时的data值为1,出现这种情况的可以看下数据库哦,此时数据库是只插入了id,但是serial字段为空,当然出现这种情况是seria可以为空。如果数据库字段设置不可为空,那么就是第一种情况了。

提示一下:不要忘记我们的@RequestBody注解哦,详细使用可以自己百度,这里就不详细介绍了。

最后再分享一下重构吧:

  1. 项目中经常会有重复的实体类出现,或者是工具类,比如时间、地址等等,那么我们每个项目都去创建或者copy一份的话,项目就会出现大量冗余代码,此时可以使用Maven对重复的类进行一个打包处理,这样我们再去使用就只需要在项目的POM.XML中通过GVA来确定我们需要的依赖就可以。

  2. 第一步,创建moudle: 名称随意: com-api-commons 。Tips:新建打包项目后,我们要在其POM.XML中加入我们所需要的依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--        hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
    
  3. 为了少修改已写好的代码,建包是,最好包名路径一致,类名也一致,最好的方法就是直接copy。妥妥的

  4. 这个时候有两种打包方法,第一种:

    1. 在IDEA中,右边工具栏,找到Maven选项,打开,选择我们的com-api-commons项目,而后先clean
    2. clean成功后,再双击install,将打包后的jar依赖,保存到我们的本地仓库
    3. 在使用到我们打包了的实体类的项目的POM.XML里添加我们的gav,即可。
    <dependency>
        <groupId>com.motcs.springcloud</groupId>
        <artifactId>com-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    

    此时项目中就可以引用了。over,今天到此结束了。明天继续!


生命不息,学习不止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值