要说springcloud,首先我们来说说tomcat,方便理解
为什么不用tomcat进行直接的开发?
1.使用tomcat开发,所有的代码都只会在一个tomcat服务器里面运行,如果这一个tomcat服务器出现了问题,满盘皆输。
2.假如我想要多个程序同时运行,这几乎不可能实现,因为只有一个服务器tomcat,想要完成并发是不可能的。
3.修改代码有困难,因为只在tomcat一个服务器里面,你想要修改某一个模块的代码,却发现这个模块的代码和其他模块的代码有着互相支持互相依赖的关系,这意味着如果你要修改这部分代码必须连着其他模块的代码一起修改,但是如果项目比较大,你是没办法看出哪里有问题的,所以这个问题也就是耦合性比较差。
当然它也是有好处的,就是容易维护。
在tomcat里面,无论你是什么模块,pojo模块也好,service模块也好,controller模块也好,最终都会被打包成一个war包,然后由这个war包统一被运行到服务器。
用分布式开发有什么好处?
1.方便功能模块的拓展,比如说你要开发一个电商网站,你不仅要做订单页面,而且购物车,商品样式界面你也要做,这就分成了几个模块,订单模块,购物车模块和商品样式模块,然后你如果需要拓展多几个模块,就可以用分布式,因为用了分布式后,可以每个模块各自对应一个tomcat,而不是所有模块只对应一个tomcat,所以拓展起来也是比较方便。
2.如果一个模块你需要改进或者优化,可以随便更改并且不会影响到其他模块。
3.代码的耦合性强,可以和其他模块互相合作而且代码的耦合性比较强。
4.可以把同一个模块多开多个进行运行,并发能力强。
缺点就是增加维护成本,也有可能会变成重复开发
springcloud有一个注册中心作为容器,就是后台模块可以把自己的功能说明加载到这个注册中心的容器当中,当然前端部分也会把自己的需求发送到注册中心的模块当中,让注册中心这个模块自己去调配这些需求对应的后台模块,进行调用,这样就方便和简洁很多
springcloud也是微服务的一个框架,具体什么是微服务呢?
以前我们做开发,开发模块的时候,有时候会选择这样子的开发模式:比如做一个电商网站,订单页面,客户管理,购物车这些模块本来是应该要分开开发,但是有些人会为了方便,把客户管理和购物车分在同一个模块进行开发,这样子也是可以开发成功。但是如果是用微服务模式进行开发,那这些功能就会被分得很细,比如客户管理模块,就会专门有小组负责这个模块,购物车模块也是,订单页面也是,每个模块对应一个小组去开发,而不会说两个模块之间混杂在一起。
如图所示,像红色框圈住的部分,每个模块就会有对应的Rest风格接口,就是一个地址,写在controller模块里面的地址,然后前端人员通过这个地址在注册中心找到对应的后台模块,进行接口并且实现功能,这样子做的好处就是无论你后台用什么语言开发,java也好,C语言开发也好,只要你提供了一个Rest接口,我前端就可以通过这个Rest接口的地址在注册中心找到你,并且使用你的功能。这就是微服务的基本概念。
微服务还有数据分离的特点,就是每个模块都可以对应不同的数据库,做到每个模块的数据库都是独立的。
阿里巴巴自己开发的微服务框架有dubbo
服务的调用方式有两种,一个是RPC方式,一个是Http方式
springcloud采用的就是Http方式,为什么使用这个方式呢,虽然说RPC方式的传输速度要比Http速度要快,但是Http方式更加灵活,因为Http是可以用不同的编程语言进行开发,而客户端调用的话只需要连接对应的Rest接口就可以了,而RPC不支持这种方式,所以Http的使用比较广泛
远程调用技术
通过这样的get请求还有post请求去调用别人网站的源码,然后就可以进行查看了,这就是远程调用技术,可以利用同样的这样的技术去调用接口
说一下一个注解@SpringBootTest,这是一个测试类注解,表示这是一个SpringBoot的测试类,然后后面的classes就把括号里面的类引导过来进行测试。
restTemplate就是一个可以远程访问客户端接口的方法。
这里就用了restTemplate的方法,写入访问的地址和访问的对象
然后注意一点,引导类已经注入了restTemplate,对应的properties文件就不详细说了。
springcloud重点学习以下的组件:
1.Eureka:服务注册中心,这个相当于刚刚说的,如下图所示
中间那个注册中心就是Eureka,这个有什么作用呢,就是把各种需求收集起来,再去调用对应的后端方法。
2.Zuul:这是一个网关组织,如果外界输入了对应的前端或者后端地址,想要访问程序,网关能及时发现并且做出转地址或者过滤操作,来保证数据的安全性。
3.Ribbon:这个的作用就是,比如说电商网站的用户管理功能,那这个电商网站有很多用户,也同样有很多个不同用户的用户管理,怎么才能保证某一个用户访问到的是自己的用户管理呢,这就需要这个Ribbon客户端负载均衡的服务调用组件,可以帮助用户选择出它自己对应的用户管理从而使用。
4.Feign:这个组件是用来调用Ribbon和Hystrix的,如果有不懂的可以看看这个图
Ribbon何时应该被调用,都是听Feign的口令,完成service之间的调用。那具体Hystrix是什么呢,请看下面
5.Hystrix是一个容错,断路的一个组件,可以这么理解,你家里如果打火锅,开电脑,开空调,开了很多很多电器,电压负载很大,突然间断电了,这是为什么,是因为保险丝断了,保险丝有什么作用呢?作用就是为了保护你家的电路安全,保险丝断开,你们家的电路才不会负载太重,同理,服务器在运行过程中如果出现负载太重,或者程序出错等等情况,Hystrix就是像保险丝一样自动断路,或者能容错就容错,但是启动Hystrix还是由Feign进行调配和管理
下面可以创建一个Springcloud工程来尝试一下:
还有个组名什么的可以自己选,也可以参考这个:
要创建springcloud,首先是要通过web来访问Rest接口吧?所以需要Web
接下来还需要数据库:
需要这些是因为到时候通过接口调用你的方法,也是要呈现出数据库的东西以及相关功能。
需要注意的是
圈起来的部分是快速版,不要用这些,用其他的正式版,比如2.0.6
选好这些后,依赖会自动导进来,进入后只需要刷新即可
遇到了一个问题,刷新后没有出现run dashboard,怎么办
把以下代码添加进workspace.xml
<component name="RunDashboard">
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
再去setting那里搜索Dashboard,该开启的就开启,然后刷新,重启
配置郁闷了文件如图所示,server:port是一个接口,你想要别人能够访问你总得需要一个接口,然后就是数据库的url地址,这个意思就是通过mybatis来连接数据库,具体操作mybatis的包是pojo包,然后我们再去操作pojo包
另外说明一下,这个是引导类:
这个是springboot应用程序类,也是引导类,是用来启动springboot程序的,我们可以用来测试
在service路径下建立pojo,建立一个class名为User
插入注解Table是在说明是数据库里面的哪个表格,然后发现报错,原因是没有插入一个依赖
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
插入这个依赖后报错消失,可以继续了
GeneratedValue这个注解的这一行的方法表示的就是使用mysql里面规定的主键作为主键。
接下来我们需要创建一个UserMapper接口,注意一定是要接口类,因为要继承Mapper,把泛型User传进去,如果不是接口类就会报错
我们并不需要在Mapper类里面协商@Mapper注解,只需要去扫描包,在引导类这一边:
注意注解用的包是tk.mybatis那个,只需要扫描包就行了,不用具体到类
然后我们需要建立一个Service类,并且声明这个Service
然后我们给它添加上方法:
这个是通过Id进行查找信息的方法,这也是解释了为什么需要Mapper这个类的作用,因为Mapper这个类建立起来这个接口之后去继承Mapper的方法,并且Mapper方法带有泛型,把User作为泛型传进来,这就等于可以让Mapper去操作用数据库封装的方法User,然后就可以写出service方法以User作为返回值,并且返回其UserMapper继承的方法Mapper中的selectByPrimaryKey方法并且传入id,这个方法就可以进入数据库并且查找这个id,然后返回它的信息
然后再建立一个Controller类,并且加上注解去声明这是一个Controller类,也可以直接声明这是一个RestController,因为是用Rest类的方法进行远程调用客户端数据,所以可以直接用RestController再声明一个地址让客户可以访问就可以了。
然后再编写方法
把Service类引导进来,这里说明一下创建类的顺序,首先是创建pojo类,进行对数据库的属性的封装,之后再创建一个UserMapper接口去继承Mapper类的方法并且传入pojo类当中的User作为泛型,之后就是Service类了,定义Service注解,后来把UserMapper拿过来,但是这个时候不能用private去封装UserMapper,因为这个是个接口类并且继承了Mapper方法的一个类,如果用private去封装它就会报错,之后写Service类,返回值为User,并且返回Mapper里面抽取对应id的全部信息的方法。最后建立Controller类,并且协商RestController,写入地址,封装Service,如上图所示,其中有几个点要解释一下:
GetMapping的注解就是说从地址上获取id属性的值,然后@PathVariable(“id”)的意思就是把GetMapping中的取到的参数传过来并赋值给id(Long id的那个id),这里要注意的是,GetMapping中的占位符id要和@PathVariable后面的id要一样,才能获得相同的值
总的来说,GetMapping和PathVariable互相组合,获取地址中的id参数并且传进来给当前方法的id,这就是它们的作用。
然后再向方法里面return service的方法并且传入他们从浏览器地址中获取的id参数并且返回数据库信息。
连接上数据库后 测试一下
ps:如果数据库连接不成功,查看一下yml文件的database中的url地址或者有没有添加数据库连接的依赖。
测试成功