微服务之服务治理
2019-12-03 本文已影响0人
i骷髅精灵
服务治理所解决的问题
在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。
另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,让后在实现本地rpc调用远程。
服务治理所使用的技术手段
1、通过注册中心实现服务的注册与发现 ,需要一个注册中心,常用的有zookeeper、Eureka、Consul 等
2、通过本地RPC接口调用需要的服务,常用Feign客户端、RestTemplate等方式
服务发现与注册的简单技术实现
Eureka实现服务的注册与发现(springcloud整合Eureka)
pom.xml 依赖项
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- springboot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- springboot整合fegnin客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
application.yml中配置
### 服务名称(服务注册到eureka名称)
spring:
application:
name: app-itmayiedu-order
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
###因为该应用为注册中心,不会注册自己,集群为true
register-with-eureka: false
###是否需要从eureka上获取注册信息,集群为true
fetch-registry: false
在启动类Application上加入注解 @EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
然后在使用到服务是就可以使用服务器名称(application.yml中配置的应用名称代替服务地址进行服务调用)
zookeeper实现服务的注册与发现(springcloud整合zookeeper)
zookeeper的整合跟Eureka非常类似
pom.xml 依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--zk工具包 保持客户端zookeeper版本与服务器端一致-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
注意zookeeper指定版本是为了服务端和客户端版本保持一致,防止兼容性的问题出现
application.yml中配置
spring:
application:
name: app-order-service
cloud:
zookeeper:
discovery:
register: true
enabled: true
instance-id: 1
root: /demo
connect-string: 39.104.124.245:2181
在启动类Application上加入注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
然后在使用到服务是就可以使用服务器名称(application.yml中配置的应用名称代替服务地址进行服务调用)