服务治理
主要作用是实现各个微服务实例的自动化注册与发现。
服务注册
在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。
服务发现
由于在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址来发现,而是通过向服务名发起请求调用实现。所以,服务调用在调用服务提供方接口的时候,并不知道具体的服务实例位置。因此,调用方需要向服务注册中心咨询服务,并获取所有服务的实例清单,以实现对具体服务实例的访问
Netfix Eureka
Eureka服务端,我们也称为服务注册中心,支持高可用配置,它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
Eureka客户端,主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身的提供的服务并周期性地发送心跳来更新它的服务租约。
搭建服务注册中心
在pom.xml中引入必要的依赖内容
org.springframework.cloud
spring-cloud-s 七 arter-eureka-server
org.springframework.cloud
spring-cloud-dependencies
Brixton.SRS
pom
import
通过@EnableEurekaServer注解启动一个注册服务中心提供给其他应用进行对话.
@EnableEurekaServer
@SpringBoo七Application
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
}
}
在默认设置下,该服务注册中心将自己作为客户端来尝试注册他自己,所以我们需要禁用它的客户端注册行为,需要在application.properties中增加以下配置:
server. port=l 111
eureka.instance.hostname = localhost
#是否设置为注册中心
eureka.client.register-with-eureka=false
eureka.client.fetch-registry = false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${serve
r.port}/eureka/
注册服务提供者
新建一个新的微服务@EnableEurekaServer
@SpringBoo七Application
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
}
}应用,接着,修改pom.xml文件,增加Spring Cloud Eureka模块的依赖
org.springframework.boot
spring-boo七-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-dependencies
Brixton.SRS
pom
import
然后,改造请求处理的接口,注入DiscoveryClient对象,
@RestController
public class HelloController {
private final Logger logger=Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/hello", me七hod= RequestMethod.GET )
public String index() {
Service Instance instance = client.getLocalServiceinstance();
logger.info("/hello, host:" + instance.getHost());
return "Hello World";
}
}
然后在主类中加上@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现。
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class) .web(七rue).run (args);
}
}
最后,我们需要在application.properties配置文件中,通过spring.application.name属性来为服务命名,再通过eureka.client.serviceUrl.defaultZone属性指定服务注册中心
spring.application.name = hello-service
eureka.client.serviceUrl.defaultZone = http://localhost:llll/eureka/
高可用注册中心
Eureka Server的高可用实际上就是将自己作为服务像其他服务注册中心注册自己,这样就形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
服务发现与消费
服务发现的任务由Eureka完成,服务消费的任务由Ribbon完成。Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端配置的ribbonServerList服务列表去轮询访问以达到均衡负载的作用。
在Eureka的服务治理体系下实现服务的发现与消费:
-启动两个服务注册中心:java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081,java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082
-创建Spring Boot的基础工程来实现服务消费者,在pom文件内添加如下依赖:
org.springframework.boot
spring-boot-starter-parent
l.3.7.RELEASE
<1-- lookup paren七 from repository -->
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-dependencies
Brixton.SRS
pom
impor七
创建应用主类ConsumerApplication,通过@EnableDiscoveryClient注解让该应用为Eureka客户端应用,以获得服务发现的能力,同时在该主类中创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端负载均衡。
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
-创建ConsumerController类并实现/ribbon-consumer接口。在该接口中,通过在上面创建的RestTemplate来实现对HELLO-SERVICE服务提供的/hello接口进行调用。
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value="/ribbon-consumer", method=RequestMethod.GET){
return restTemplate.getForEntity("http://HELLO_SERVICE/hello", String.class).getBody();
}
}
-在application.properties中配置Eureka服务注册中心的位置,,需要与之前的HELLO-SERVICE的ip一样,否则将无法发现该服务。
spring.application.name=ribbon-consumer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
-向htttp://localhost:9000/ribbon-consumer发起GET请求,成功则返回Hello World。