上一篇:SpringCloud微服务初学篇
前言
上一篇刚刚创建好父工程,接下来我们创建子工程。
SpringCloud-Rest微服务案例
首先来介绍一下项目流程,用户访问订单微服务,然后订单微服务调用支付微服务。
构建步骤
1、 cloud-provider-payment8001微服务提供者支付Module模块
2、 热部署Devtools
3、 Cloud-consumer-order80微服务消费者订单Module模块
4、 工程重构
如何构建微服务模块?
搭建cloud-provider-payment8001项目
1) 建module
groupId:com.tedu.springcloud
artifactId:cloud-provider-payment8001
通常情况下goupId是你启动类包名,artifactId是项目名,在这块就是pom依赖最重要的地方。由于小编在创建module的时候当时还不知道,所以,比较乱,但是只要记住这个规则,基本上就没什么问题。
点击父工程tedu,鼠标右键,新建一个module
2)改pom
这一步主要在子项目中添加相关依赖即可
3)写yml
在resources中新建一个application.yml作为springboot的配置文件,注意缩进
4)主启动类
为springboot项目添加主启动类,在项目报下创建启动类。
5)业务类
controller、service、dao、entities
①这里要补充一点的是lombok的作用
目前为止,我只知道这个依赖的作用是为了省去我们写实体类的set、get以及全参、无参构造器的方法
②、创建dao层
这里要说一下@Mapper注解和@MapperScan注解的区别
@Mapper:创建bean对象
与@MapperScan的区别就是@MapperScan只用在启动类写一次即可,因为他扫描的是整个包
但是@Mapper注解却要一个一个加在dao层的mapper上
③、创建service层
接口
实现类
@Resource这个注解跟@Autowired注解用法一样,也是可以进行自动装配的。
不过@Resource是属于java自带的,@Autowired属于spring的
④、创建结果集CommonResult类
⑤、创建Controller层
补充一点:
@Slf4j注解:一开始@Slf4j注解莫名其妙,只知道是打日志用的,后来运行起来,打出来日志才知道如下这样:
现在基本可以开始启动项目了,但是,没有配置Tomcat如何启动呢,况且正常情况下,启动按钮是灰色的。但是你要注意,在springcloud项目(此项目用springboot)里每个微服务都是由springboot框架,然而springboot自带tomcat,所以可以直接在其启动类里右键直接启动该项目,正常情况下是可以启动的起来的,但是,如果还启动不起来,可以试试再重新下载jar包,方法:找到项目根目录,右键选择maven,然后选择reload project即可。
现在问题又来了,如果每次修改其中的代码,那岂不是都得需要重新启动一下才能生效吗,这样的话就有点麻烦了,所以接下来要配置我们的热部署。
热部署
作用是为了更方便的写代码,怎么方便呢,注意,现在假如你启动项目完毕后,再进行修改代码,这样是不会直接有效果的,除非你重新启动项目;如果进行了热部署以后,再启动过程中再进行修改代码,会直接响应。
步骤:
1:在子项目中添加devtools依赖
2:修改父工程中pom的plugins
3:开启自动编译选项
4:更新设置
更新设置选择快捷键Ctrl+shif+alt+/,出现这么个窗口,然后选择第一个
然后找到下图两个东西勾选上
5、设置update时的操作
最后重启idea即可。
再来回顾一下我们所需要做的事情,客户端访问订单微服务,然后订单微服务再去调用支付微服务这样的一个过程。
所以接下来开始搭建订单微服务。
搭建cloud-consumer-order80
- groupId:com.tedu.springcloud
- artifactId: cloud-consumer-order80
我们要用客户端调用订单服务,订单微服务再调用支付微服务,所以module之间的通讯就不能直接用http来连接,我们用RestTemplate,RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷服务模板,是Spring提供的访问用于Rest服务的客户端模板工具集。
RestTemplate
API官方文档。
使用restTemplate访问restful和接口非常简单(url , requestMap , ResonseBean.class)这三个参数分别代表RESR请求地址、请求参数、HTTP响应转换被转换成的对象类型。
那么现在来搞客户端,用客户端调取微服务接口,其步骤跟8001端口类似,同样的有这么几步:建立module、修改pom、写YML、启动类、业务逻辑代码。
跟8001端口类似的步骤我就省略,但是有些地方不一样,比如,客户端只需要调用即可,没必去调用数据库里的东西,他要调用的就是微服务,所以没有mybatis和数据库项相关的依赖,所以我们的80端口pom依赖可以是这样的:
restTemplate配置
创建配置类config.ApplicationConextConfig.class,这个类要让他启动项目时就建立好,所以我们把他当作spring的配置类配置。
controller层
那么如何通过restTemplate来访问8001端口的服务呢,首先我们要自动注入一个RestTemplate类,然后通过如下方法来调用。
restTemplate.getForObject(url:"" , CommonResult.class);
restTemplate.postForObject(url:"" ,payment, CommonResult.class);
其返回对象皆是你所给的CommonResult.class这个东西。
这里要重点强调一下@RequestBody和@ResponseBody的区别:
@RequestBody:说白了就是将json格式的数据转换城JavaBean对象,注意,写法要在参数前面加,不要加在方法上
@ResponseBody:与@RequestBody相对应,将JavaBean对象转换为json格式的字符串返回给客户端,这时需要写道方法名字上
那么问题来了,两个module中间传递的到底是什么东东?
项目重构
到这里我们可以发现,在80和8001项目中,都有一个相同的entities包,所以我们再重构一下项目布局。目的是把entities包给合并起来。
我们可以再新建一个module项目,然后对其进行进一步配置,操作如下:
1、新建一个cloud-api-commons
2、Pom依赖
3、复制重复的Entities到新项目中,并删除80、8001项目的entities包
4、利用maven命令clean和install
5、分别在80和8001项目添加刚刚install的依赖
创建项目,由于之前创建过,所以Artifacld名字重复爆红线属于正常。
直接从添加cloud-api-commons项目依赖开始,以下是需要添加的依赖。
<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>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
在该工程中,选择右边的maven,点击闪电标识符,会发现test有个横线,说明不需要进行测试,以此执行clea和install命令。
然后我们就可以对80和8001项目进行添加该依赖
原来我们在创建项目的同时就已经对其groupId、artifactId和version确定。如下:
导入公共包(entities)
再次测试即可
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/11683.html