SpringCloud是一系列框架的有序集合。它以SpringBoot框架为基础,将各家公司的所造的值得信赖的轮子通过SpringBoot进行集成的一款微服务框架。
eureka组件,在SpringCloud中承担服务注册中心的角色。
eureka在使用中分为两个角色eureka-server和eureka-client,eureka-client又分为消费者和生产者
#启用服务消费者从注册中心拉取服务列表的功能
eureka.client.fetch-registry=true
#设置服务消费者从注册中心拉取服务列表的间隔
eureka.client.registry-fetch-interval-seconds=30
服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
服务失效的时间,默认为90秒。
eureka.instance.lease-expiration-duration-in-seconds=90
//下线前手动调用
DiscoveryManager.getInstance().shutdownComponent();
引用场景:在分布式环境中,有些服务特别的重要,例如 支付服务、网关、注册中心等,如果这些服务宕机,对整个微服务的架构影响特别大,为了及时告知开发人员或者运维人员,eureka提供了对应的监听事件。
package com.example.listener;
/**
* @BelongsProject: springcloudday01
* @BelongsPackage: com.example.listener
* @Author: mrmei
* @CreateTime: 2020-11-10 17:22
* @Description: eureka事件监听类
*/
@Component
public class EurekaListener {
/**
* eureka注册中心被注册服务下线监听事件
* @param event
*/
@EventListener
public void eurekaListenerEvent(EurekaInstanceCanceledEvent event){
System.out.println("有服务下线了。。。。。。。。。。。。。");
System.out.println(event.getAppName()+"服务下线了");
System.out.println(event.toString());
}
/**
* 服务注册监听事件
* @param event
*/
@EventListener
public void eurekaListenerEvent(EurekaInstanceRegisteredEvent event){
System.out.println("有服务来进行注册了。。。。。。。。。。。。。");
System.out.println(event.toString());
}
/**
* 服务续约监听事件
* @param event
*/
@EventListener
public void eurekaListenerEvent(EurekaInstanceRenewedEvent event){
System.out.println("有服务来续约了。。。。。。。。。。。。。");
System.out.println(event.getAppName()+"服务进行续约");
System.out.println(event.toString());
}
/**
* eureka服务可以注册其它服务事件
* @param event
*/
@EventListener
public void eurekaListenerEvent(EurekaRegistryAvailableEvent event){
System.out.println("服务可以注册其它服务了。。。。。。。。。。。。。");
System.out.println(event.toString());
}
/**
* eureka服务启动事件
* @param event
*/
@EventListener
public void eurekaListenerEvent(EurekaServerStartedEvent event){
System.out.println("eureka服务启动了。。。。。。。。。。。。。");
System.out.println(event.toString());
}
}
用户量比较大,用户地理位置分布较广,会布置多个机房,如果服务之间需要互相调用,希望同一个机房的服务可以优先调用,当同一个机房的服务不可用时,再去访问其它机房的服务,达到减少网络延迟的效果,提升用户的体验。eureka分区的功能借鉴了亚马逊aws的思想。
#配置服务的region
eureka:
client:
region: wuhan
#配置所在region的zone
eureka:
instance:
metadata-map:
zone: wuhan-jifang1
client:
#配置每个region可用的zone
availability-zones:
wuhan: wuhan-jifang1,wuhan-jifang2
shanghai: shanghai-jifang1
图片是借鉴别人的,如有雷同,是我copy的。。。。。
RestTemplate时spring提供的访问rest服务的工具。
三种使用方式:
RestTemplate restTemplate = new RestTemplate();
String response restTemplate.getForObject("http://localhost:2001/getUserServiceDetail", String.class);
ServiceInstance serviceInstance = loadBalancerClient.choose("USER");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()) + "/getUserServiceDetail";
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
String response = restTemplate.getForObject("http://USER/getUserServiceDetail", String.class);
openFeign为springcloud组件,实现分布式架构中各节点的同步调用。
使用步骤:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
//注解的name属性为服务的对应的spring.application.name
@FeignClient(name = "user")
@RequestMapping("user")
public interface UserFeign {
/**
* 注册的接口
* @param user
* @return
*/
@PostMapping("login")
ResEntity login(@RequestBody User user);
}
//消费者服务的controller
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private UserFeign userFeign;
@GetMapping("login")
public ResEntity login(){
User user = new User("root","root");
ResEntity login = userFeign.login(user);
return login;
}
}
//生产者服务的controller
@RestController
@RequestMapping("user")
public class UserController {
@Value("${spring.application.name}")
private String serviceName;
@Value("${server.port}")
private String port;
@PostMapping("login")
public ResEntity login(@RequestBody User user){
if(user==null){
return ResEntity.fail().msg("用户名或密码不能为空");
}else{
if("root".equals(user.getUserName()) && "root".equals(user.getPassword())){
return ResEntity.success(null);
}else{
return ResEntity.fail().msg("用户名或密码错误");
}
}
}
}
由以上代码可知,生产者调用user服务的feign接口,猜测openFeign的实现原理为jdk的动态代理。
以上代码的demo,有需要自取