SpringCloud
1.微服务远程调用
为了实现远程调用,首先在调用方注册RestTemplate
其次在调用方法下使用RestTemplate的方法
如果是get就用get方法,如果是Post就用post方法
实例中getForObject返回的是Json对象,但是直接给实体类class的话会自动反序列化为对应实体类
2.Eureka注册中心
1.准备工作
1)添加依赖
<dependencies>
<!-- eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
由于父工程springcloud的spring0cloud-dependencies管理着因此没有版本号
2)添加启动注解
3)配置文件
配置完成之后启动Eurekaapplication显示
2.服务注册
1)在对应需要注册的服务添加依赖
<!-- eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2)配置文件更新
将eureka配置信息更新到服务配置文件即可
按照同样步骤配置orderservice
测试结果,可以看到三个服务均已完成注册
3)多实例启动
以上为单个实例启动,如果需要同一服务多实例启动,以user服务为例
在copy configuration下配置环境VM
配置完成后出现新的服务实例
启动后测试完成
3.服务拉取
1)修改调用方预调用Url
url中之前写死的localhost更改为服务名称(从服务方配置文件中copy)
2)添加负载均衡注解
3.Ribbon负载均衡
1.负载均衡流程
个人理解消费者调用服务发起请求,通过负载均衡拦截器向eureka服务端获取服务列表,再结合IRule接口下的算法即负载均衡策略确定服务端口,最终将请求发送到消费者
2.修改负载均衡策略
1)方案一(全局方案)
在配置类中定义Bean修改负载均衡策略
2)方案二(针对具体的某个服务)
userservice下的负载均衡策略
3.饥饿加载
Ribbon默认为懒加载,即第一次调用时才拉取服务,耗时较长
在调用方进行设置
4.Nacos
1.准备工作
1)在父工程引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
2)修改子工程依赖,将eureka依赖替换成nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3)yml文件配置
2.服务注册发现
由于Springcloud common定义了共同的接口,只需要将pom以及yml文件配置完成,不修改eureka使用时的代码即可使用Nacos
3.启动服务
在安装路径bin文件中cmd输入startup.cmd -m standalone
成功启动后输入console地址即可进入登录界面,默认账号密码均为nacos
4.集群定义
1)消费者定义
修改yml
测试结果
在yml中再次更换集群名称,启动未开启的服务
2)服务者定义
假设该服务者处于PZH集群,首先进行pml配置
集群内部应该优先访问,即PZH的消费者访问PZH的服务者,pml配置,定义负债均衡的规则(集群优先,本质是随机)
3)权重分配
当同一集群中服务器老旧不一,可以调整权重从而保证服务器访问频率不同
4)环境隔离
开辟新的命名空间实现环境隔离,ID可以不设置自动通过UUID进行设置
ID生成之后可将其设置到yml文件中,从而使对应服务处于该命名空间下从而实现与其他服务的环境隔离,其他服务无法再访问调用该服务
5.配置管理
1)新建配置管理
ID一般以微服务名称及生产开发环境命名,配置内容主要写可能需要热更新、未来有变化的配置
2)统一配置管理
在需要配置的微服务中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在resources下添加bootstrap.yml,名称、开发环境及后缀与nacos管理的配置一致,注意在配置时将application.yml中相同的信息删除
3)测试
由于nacos管理的配置下定义了日期格式,因此在Controller中定义方法
4)配置热更新
方式一:在Controller上添加@RefreshScope
方式二:使用@ConfigurationProperties注解
新建一个注册类,注意注解添加前缀,只有前缀+字段名相符,配置文件才能被读取
修改Controller文件
5)多环境配置共享
6)集群搭建
搭建数据库,初始化数据库表结构
Nacos安装配置,集群配置与单机配置有些许区别
启动nacos集群,启动命令为startup.cmd
nginx反向代理
5.Feigh
1.远程调用
使用resttemplate时的调用
1)依赖注入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)添加注解
之后在启动类添加注解@EnableFeignClients
3)编写调用接口
4)修改方法
2.自定义配置
1)配置Feigh日志
方式一:配置文件方式
全局配置
局部配置则将default修改为具体的服务名称即可
方式二:java代码方式
首先定义配置类
全局配置,在启动类加注解
局部配置,则在对应的类添加注解
3.Feign的性能优化
1)使用连接池代替默认的URLConnection
添加依赖
<!-- 引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池
2)日志级别,最好用basic或none
4.Feign的最佳实践
1)让Controller和FeignClient继承统一接口(不推荐)
2)将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用
首先创建Feign-Api模块,引入依赖
将order-service下的Feign相关类接口转移到该模块下
由于在oder-service将之前的user删除了,因此导入Feign-api模组
启动测试时发现orderservice报错,原因在于启动扫描的包下已经没有了userClient这个类,没有注入到Spring中进行管理
解决方式:
在启动类下指定Feignapi模块下的类
6.网关Gateway
1.搭建网关服务
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
创建服务主函数
2.编写路由配置及nacos地址
其中路由id一定要唯一
路由目标uri http则代表固定地址,lb代表根据服务名负载均衡
路由断言,判断路由的规则
流程图:
3.路由断言工厂
4.过滤器工厂
作用是对路由进行处理,具体类型可查看Spring官网,下面以AddRequestHeader为例
首先在gateway的配置文件中定义过滤器
在某个微服务下提取请求头
网页查找时后台会打印
5.全局过滤器
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter类似
但区别在于GatewayFilter需要配置定义,处理逻辑固定,但是GlobalFilter逻辑需要代码实现,更符合个人想法实现自由
例子为登录时验证的过滤
对于执行顺序,也可以采用实现接口ordered的方式
结果显示只有当请求头存在要求值才能够获取参数
6.过滤器执行顺序
每一个过滤器都必须指定一个int类型的Order值,order值越小,优先级越高,执行顺序越靠前
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定值
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
当过滤器的Order值一致时,会按照默认过滤器>路由过滤器>GlobalFilter的顺序执行
7.跨域问题处理
域名不一致或者端口不一致就是跨域
跨域问题:浏览器禁止请求的发起者与服务端发生跨域Ajax请求,请求呗浏览器拦截的问题
在gateway配置文件中配置
本文来自博客园,作者:面向机器编程,转载请注明原文链接:https://www.cnblogs.com/face-to-machine-program/articles/16320179.html