虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用
一、微服务注册中心Consul
编写完延迟任务系统的web层接口,也就是说可以基于http协议来访问延迟系统,接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现,服务的注册与发现都离不开服务的注册中心,本项目选取Consul作为注册中心。
注册中心为什么选择Consul?
SpringCloud支持很多的服务发现软件,Eureka只是其中之一,常见的服务发现软件有:
Eureka
Consul
Zookeeper
Feature
etcd
Consul的特性:
1.Consul是一个分布式高可用系统,他包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置功能。
2.是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。
3.内置了服务注册与发现框架,分布式一致性协议实现,健康检查,key/value存储,多数据中心方案。
4.分布式实现不需要依赖其他工具,比如Zookeeper。
5.使用Go语言编写,具备天然可移植性,支持Linux、windows和Mac OS X,安装包仅一个可执行文件。
1.1.Consul安装
启动成功后打开浏览器访问网址: http://localhost:8500/
1.2.Consul的特性
服务发现、健康检查、Key/Value存储、多数据中心
1.3.Consul的优势
1.使用Raft算法保证一致性,比复杂的Paxos算法更直接。
2.支持多数据中心,内外网的服务采用不同端口进行监听。多数据中心集群可以避免但数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况。
3.支持健康检查
4.支持HTTP和DNS协议接口
5.官方提供web管理界面
1.4.Consul的角色
Client客户端:
1.无状态
2.将HTTP和DNS接口请求转发给局域网的服务端集群
server服务端:
1.保存配置信息
2.高可用集群
3.在局域网内与本地客户端通信
4.通过广域网与其他数据中心通信
5.每个数据中心的server数量推荐3个或5个
Consul的服务端和客户端支持跨中心使用,更加提升了高可用性。
二、SpringCloud集成Consul
现在需要使用SpringCloud集成Consol,将延迟任务注册到注册中心,变成一个服务。目前项目都是基于SpringBoot去构建的,需要将两者版本进行对应避免在开发过程中出现一些不必要的麻烦,需要注意SpringBoot和SpringCloud的版本对应关系。
步骤一:在chongba_parent父工程的pom文件中添加SpringCloud的依赖管理
先添加properties版本号参数
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
然后添加SpringCloud依赖坐标
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
步骤二:延迟任务系统需要在注册中心去注册,在chongba_schedule_service的pom文件中添加依赖
<!--健康检查依赖包-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringCloudConsul支持包-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
步骤三:在chongba_schedule_service的application.yml配置文件中添加如下配置
springcloud:consul:host: 127.0.0.1port: 8500discovery:serviceName: ${spring.application.name}
步骤四:启动ScheduleApplication,查看Consul的UI控制台界面
三、延迟任务Feign集成
项目目前已经使用springcloud和consol进行了集成。并且将延迟任务系统在注册中心进行了注册,已经注册成为了一个微服务。并且我们已经启动了两个节点,成功改造成了分布式。
那么我们如何去调用服务?我们不可能使用向之前那样使用PostMan 去发送http请求调用。我们需要集成Feign组件。Feign组件集成之后,我们对服务的调用就会转换为对Feign接口方法的调用,使得调用http服务更加的简单。
Feign是一个声明式的HTTP客户端,spring-cloud-openfeign将feign集成到spring boot中,在接口上通过注解声明Rest协议,就能将http调用转换为接口方法的调用,这样达到客户端调用http服务更加简单。
此外:Spring Cloud Feign还整合了Spring Cloud Ribbon (负载均衡)和Spring Cloud Hystrix(熔断器)
步骤:
步骤1:在父工程chongba_parent下创建子模块chongba_schedule_feign,单独创建一个feign模块的作用是为了让其他模块使用起来更加的方便,直接引入feign模块即可。
步骤2:在chongba_schedule_feign模块的pom文件中添加如下依赖
<dependencies><dependency><groupId>com.chongba</groupId><artifactId>chongba_common</artifactId><version>1.0-SNAPSHOT</version></dependency>
<!--健康检查依赖包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--SpringCloudConsul支持包--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
<!--feign 支持 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>
步骤3:在src/main/java下创建包com.chongba.feign,并在该包下创建TaskServiceClient接口,用于调用延迟任务服务schedule-service
@FeignClient("schedule-service") //指定调用的服务名称
public interface TaskServiceClient {@PostMapping("/task/push")public ResponseMessage push(@RequestBody Task task);@GetMapping("/task/poll/{type}/{priority}")public ResponseMessage poll(@PathVariable("type") Integer type, @PathVariable("priority") Integer priority);@PostMapping("/task/cancel")public ResponseMessage cancel(@RequestParam("taskId") Long taskId);
}
下面如果想在chongba_schedule_feign工程中直接能对TaskServiceClient接口中的方法进行测试,则需要进行如下步骤的配置操作:
步骤1:在src/main/resources下创建配置文件 application.yml,并添加如下配置
spring: application: name: fegin #指定服务名cloud:consul:host: 127.0.0.1port: 8500discovery:register: false #不需要注册到consul
注意:feign无需在consul中注册,因为feign只需要去发现服务然后进行调用即可,自己本身并不需要称为一个服务
步骤2:在chongba_schedule_feign下创建启动类FeignAppliction
@SpringBootApplication
@EnableFeignClients
public class FeignAppliction {public static void main(String[] args) {SpringApplication.run(FeignAppliction.class,args);}
}
步骤3:在chongba_schedule_feign工程下创建测试包:com.chongba.feign,并创建测试类TaskClientTest,添加测试方法测试添加任务
@RunWith(SpringRunner.class)
@SpringBootTest(classes = FeignAppliction.class)
public class TaskClientTest {@Autowiredprivate TaskServiceClient taskServiceClient;@Testpublic void test1(){for (int i = 0; i < 4; i++) {Task task = new Task();task.setTaskType(2003);task.setParameters("testFeignClient".getBytes());task.setPriority(100);task.setExecuteTime(new Date().getTime());ResponseMessage reponse = taskServiceClient.push(task);System.out.println(reponse);}}@Testpublic void test2(){ResponseMessage message = taskServiceClient.poll(2003, 100);System.out.println(message);}@Testpublic void test3(){taskServiceClient.cancel(1175734747444367362L);// 从数据库或缓存中查找一个任务id}
}
步骤4:测试,先清空数据库和缓存,必须保证延迟任务服务是启动状态,启动两个节点:81,82,以便测试出feign对负载均衡的集成。
feign接口注意事项:
- 当参数比较复杂时,feign即使声明为get请求也会强行使用post请求
HTTP 405 错误 – 方法不被允许 (Method not allowed) - 有参数时候必须使用 @RequestParam注解 必须要在后面加上参数名