最近项目中使用SpringCloud做微服务架构,所以对微服务体系进行了系统的学习
一,服务注册和发现中心Eureka
1,Eurekaserver和Eurekaclienta,Eurekaserver注解 @SpringBootApplication和@EnableEurekaServer
服务注册中心
b,Eurekaclient注解 @SpringBootApplication和@EnableEurekaClient
启动后将服务注册到注册中心
二-1,服务消费者Feign(服务之间相互调用RPC)
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解,注解中value为被调用的eurekaclient服务,接口中每个方法的requestmapping的url地址需与被调用服务的对应方法url地址一致。在其他项目中只需注入这个接口,就可调用被代理的eurekaclient服务。
定义一个feign接口
@FeignClient(value = "service-hi")
public interface SchedualServiceHi {
@RequestMapping(value = "/hi", method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
一个”/hi”的API接口
@RestController
public class HiController {
@Autowired
SchedualServiceHi schedualServiceHi;
@RequestMapping(value = "/hi",method = RequestMethod.GET)
public String sayHi(@RequestParam String name){
return schedualServiceHi.sayHiFromClientOne(name);
}
}
二-2,服务消费者RestTemplate(服务之间相互调用RPC)
通过之前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
对RestTemplate加负载均衡标签
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
使用RestTemplate调用其他服务的方法
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloController() {
return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
}
}
三,断路器Hystrix
较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。
在项目启动类上加@EnableHystrix断路器注解,在controller方法上加@HystrixCommand(fallbackMethod = "hiError")注解,同时定义hiError回调函数,若该方法出现熔断,则执行hiError方法
四,智能路由zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。
在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:
@EnableZuulProxy
@EnableEurekaClient
五,分布式配置中心组件spring cloud config
它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
在config server的入口加上@enableconfigserver注解,并需要配置远程仓库git的参数,在config client中配置config地址等参数,即可从远程仓库中获取参数值
五,消息总线spring cloud bus
在需要接受消息的项目中配置RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码
只要通过其中一个项目访问/bus/refresh,则其他项目都会收到消息总线的刷新通知