1分pk10登录中心_架构师入门:搭建基本的Eureka架构(从项目里抽取)
- 时间:
- 浏览:3
这麼 废话,直接上干货,理论次责.我.我.我 歌词 都可不还可以 看其它资料。
这里是次责关键代码,不可能 时需全部可运行的代码,请给我该人留言。
在后继,还将给出搭建高可用Eureka架构的法律依据。
1 Eureka的框架图
在Eureka的服务器里,含有着记录当前所有服务列表的注册中心,而服务提供者和调用者所在的机器均被称为“Eureka客户端”。
服务提供者会和服务器进行如下的交互:第一,注册两种 能提供的服务,第二,定时发送心跳,以此证明本服务所处生效状况。而服务调用者一般会从服务器查找服务,并根据找到的结果从服务提供者这端调用服务。
2.1搭建Eureka服务器
这里.我.我.我 歌词 将在EurekaBasicDemo-Server项目里编写Eureka服务器的代码。
第一步,.我.我.我 歌词 创建完Maven类型的项目后,时需在pom.xml里编写该项目所时需的依赖包,关键代码如下。
1 <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>org.springframework.cloud</groupId>
5 <artifactId>spring-cloud-dependencies</artifactId>
6 <version>Brixton.SR5</version>
7 <type>pom</type>
8 <scope>import</scope>
9 </dependency>
10 </dependencies>
11 </dependencyManagement>
12 <dependencies>
13 <dependency>
14 <groupId>org.springframework.cloud</groupId>
15 <artifactId>spring-cloud-starter-eureka-server</artifactId>
16 </dependency>
17 </project>
从第1到第11行,.我.我.我 歌词 引入了版本号是Brixton.SR5的Spring Cloud包,你什儿 包里含有着Eureka的支持包,在第13到16行的代码里,引入了Eureka Server端的支持包,引入后,.我.我.我 歌词 要能在项目的java文件里使用Eureka的型态。
第二步,在application.yml里,时需配置Eureka服务端的信息,代码如下。
1 server: 2 port: 8888 3 eureka: 4 instance: 5 hostname: localhost 6 client: 7 register-with-eureka: false 8 fetch-registry: false 9 serviceUrl: 10 defaultZone: http://localhost:8888/eureka/
从第2和第5行里,.我.我.我 歌词 指定了Eureka服务端使用的主机地址和端口号,这里分别是localhost和8888,也可是说让服务端运行在本地8888号端口,在第10行里,.我.我.我 歌词 指定了服务端所在的url地址。
不可能 这不可能 是服务器端,可是.我.我.我 歌词 通过第7行的代码,指定不会向Eureka注册中心注册我该人,同理,服务器端的职责是维护服务列表而全部都是调用服务,可是通过第8行的代码指定本端不会检索服务。
第三步,在RegisterCenterApp.java里编写Eureka启动代码。
1 省略必要的package和import代码 2 @EnableEurekaServer //指定本项目是Eureka服务端 3 @SpringBootApplication 4 public class RegisterCenterApp 5 { 6 public static void main( String[] args ) 7 {SpringApplication.run(RegisterCenterApp.class, args);} 8 }
在第6行的main函数里,.我.我.我 歌词 还是通过run法律依据启动Eureka服务。
运行App.java启动Eureka服务器端后,在浏览器里输入localhost:8888后,都可不还可以 看得人如下图所示的Eureka服务器端的信息面板,其中Instances currently registered with Eureka目前是空的,说明尚未有服务注册到本服务器的注册中心。
2.2 编写作为服务提供者的Eureka客户端
这里.我.我.我 歌词 将在EurekaBasicDemo-ServerProvider项目里编写Eureka客户端的代码,在你什儿 项目里,.我.我.我 歌词 将提供有2个多多多 SayHello的服务。
第一步,创建完Maven类型的项目后,.我.我.我 歌词 时需在pom.xml里写入本项目的依赖包,关键代码如下。本项目所用到的依赖包完后 都用过,可是这里就不展开讲了。
1 <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId>
5 <version>Brixton.SR5</version>
6 <type>pom</type>
7 <scope>import</scope>
8 </dependency>
9 </dependencies>
10 </dependencyManagement>
11 <dependencies>
12 <dependency>
13 <groupId>org.springframework.boot</groupId>
14 <artifactId>spring-boot-starter-web</artifactId>
15 <version>1.5.4.RELEASE</version>
16 </dependency>
17 <dependency>
18 <groupId>org.springframework.cloud</groupId>
19 <artifactId>spring-cloud-starter-eureka</artifactId>
20 </dependency>
21 </dependencies>
第二步,在application.yml里编写针对服务提供者的配置信息,代码如下。
1 server: 2 port: 1111 3 spring: 4 application: 5 name: sayHello 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/
从第2行里,.我.我.我 歌词 能看得人本服务将启用1111号端口,在第5行,.我.我.我 歌词 指定了本服务的名字,叫sayHello,在第9行,.我.我.我 歌词 把本服务注册到了Eureka服务端,也可是注册中心里。
第三步,在Controller.java里,编写控制器次责的代码,在其中实现对外的服务。
1 //省略必要的package和import代码 2 @RestController //说明这是个控制器 3 public class Controller { 4 @Autowired //描述Eureka客户端信息的类 5 private DiscoveryClient client; 6 @RequestMapping(value = "/hello/{username}", method = RequestMethod.GET ) 7 public String hello(@PathVariable("username") String username) { 8 ServiceInstance instance = client.getLocalServiceInstance(); 9 //输出服务相关的信息 10 System.out.println("host is:" + instance.getHost()); 11 System.out.println("port is:" + instance.getPort()); 12 System.out.println("ServiceID is:" + instance.getServiceId() ); 13 //返回字符串 14 return "hello " + username; 15 } 16 }
.我.我.我 歌词 通过第6和第7行的代码,指定了能触发hello法律依据的url格式,在你什儿 法律依据里,.我.我.我 歌词 首先通过第10到12行的代码,输出了主机名、端口号和ServiceID等信息,并在第14行里,返回了有2个多多多 字符串。
第四步,编写Spring Boot的启动类ServiceProviderApp.java,代码如下。
1 //省略必要的package和import代码 2 @SpringBootApplication 3 @EnableEurekaClient 4 public class ServiceProviderApp { 5 public static void main( String[] args ) 6 {SpringApplication.run(ServiceProviderApp.class, args);} 7 }
不可能 这是所处Eureka的客户端,可是加入第3行所示的注解,在main函数里,.我.我.我 歌词 依然是通过run法律依据启动Spring Boot服务。
2.3 编写服务调用者的代码
启动Eureka服务器端的RegisterApp.java和服务提供者端的ServiceProviderApp.java,在浏览器里输入http://localhost:8888/后,在Eureka的信息面板都可不还可以 看得人SayHello服务,如下图所示。
不可能 这时.我.我.我 歌词 在浏览器里输入http://localhost:1111/hello/Mike,能直接调用服务,一起能看浏览器里看得人“hello Mike”的输出。不过在大多数的场景里,.我.我.我 歌词 一般是在多多程序 里调用服务,而全部都是简单地通过浏览器调用,在下面的EurekaBasicDemo-ServiceCaller项目里,.我.我.我 歌词 将演示在Eureka客户端调用服务的步骤。
第一步。在你什儿 Maven项目里,.我.我.我 歌词 编写如下的pom.xml配置,关键代码如下。
1 <dependencyManagement> 2 <dependencies> 3 <dependency> 4 <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId> 5 <version>Brixton.SR5</version> 6 <type>pom</type> 7 <scope>import</scope> 8 </dependency> 9 </dependencies> 10 </dependencyManagement> 11 <dependencies> 12 <dependency> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-web</artifactId> 15 <version>1.5.4.RELEASE</version> 16 </dependency> 17 <dependency> 18 <groupId>org.springframework.cloud</groupId> 19 <artifactId>spring-cloud-starter-eureka</artifactId> 20 </dependency> 21 <dependency> 22 <groupId>org.springframework.cloud</groupId> 23 <artifactId>spring-cloud-starter-ribbon</artifactId> 24 </dependency> 25 </dependencies>
请.我.我.我 歌词 注意,从第21到24行,.我.我.我 歌词 时需引入 ribbon的依赖包,通过它.我.我.我 歌词 都可不还可以 实现负载均衡。而其它的依赖包.我.我.我 歌词 完后 全部都是可能 见过,可是就不再解释了。
第二步,在application.yml里,.我.我.我 歌词 编写针对本项目的配置信息,代码如下。
1 spring: 2 application: 3 name: callHello 4 server: 5 port: 200200 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/
在第3行里,.我.我.我 歌词 指定了本服务的名字叫callHello,在第5行里.我.我.我 歌词 指定了本服务是运行在200200端口,在第9行里,.我.我.我 歌词 把本服务注册到Eureka服务器上。
第三步,编写提供服务的控制器类,在其中调用服务提供者的提供的服务,代码如下。
1 //省略必要的package和import代码 2 @RestController 3 @Configuration 4 public class Controller { 5 @Bean 6 @LoadBalanced 7 public RestTemplate getRestTemplate() 8 { return new RestTemplate(); } 9 10 @RequestMapping(value = "/hello", method = RequestMethod.GET ) 11 public String hello() { 12 RestTemplate template = getRestTemplate(); 13 String retVal = template.getForEntity("http://sayHello/hello/Eureka", String.class).getBody(); 14 return "In Caller, " + retVal; 15 } 16 }
在第7行的getRestTemplate法律依据上,.我.我.我 歌词 启动了@LoadBalanced(负载均衡)的注解。关于负载均衡的细节将在上面章节里全部描述,这里.我.我.我 歌词 引入@LoadBalanced注解的原困着是,RestTemplate类型的对象两种 不具备调用远程服务的能力,也可是说,不可能 .我.我.我 歌词 加上你什儿 注解,多多程序 何必 能跑通。只能.我.我.我 歌词 引入该注解,该法律依据所返回的对象要能具备调用远程服务的能力。
在提供服务的第11行的hello法律依据里,.我.我.我 歌词 是通过第13行的代码,用RestTemplate类型对象的getForEntity法律依据,调用服务提供者sayHello提供的hello法律依据。
这里.我.我.我 歌词 是通过http://sayHello/hello/Eureka你什儿 url去发现对应的服务,在你什儿 url里,只含有了服务名sayHello,并这麼 含有服务所在的主机名和端口号,换句话说,该url人太好是通过注册中心定位到sayHello服务的物理位置的。
至于你什儿 url和该服务物理位置的绑定关系,是在Eureka组织组织结构实现的,这也是Eureka都可不还可以 被称作“服务发现框架”的原困着。
第四步,在ServiceCallerApp.java法律依据里,.我.我.我 歌词 编写启动本服务的代码,你什儿 们不可能 没熟悉了,可是就不再讲述了。
1 //省略必要的package和import代码 2 @EnableDiscoveryClient 3 @SpringBootApplication 4 public class ServiceCallerApp 5 { 6 public static void main( String[] args ) 7 {SpringApplication.run(ServiceCallerApp.class, args); } 8 }
2.4 通过服务调用者调用服务
.我.我.我 歌词 依次启动Eureka服务器(也可是注册中心)、服务提供者和服务调用者的Spring Boot启动多多程序 后,在浏览器里输入http://localhost:8888/后,能在信息面板里看得人有有2个多多多 服务,分别是服务提供者SayHello和服务调用者CallHello,如下图所示。
不可能 服务调用者运行在200200端口上,可是不可能 .我.我.我 歌词 在浏览器里输入http://localhost:200200/hello,能看得人在浏览器里输出“In Caller, hello Eureka”,这可是明它人太好不可能 调用了服务提供者SayHello里的hello法律依据。
此外,.我.我.我 歌词 还能在服务提供者所在的控制台里看得人host、port和ServiceID的输出,如下图所示,这能进一步验证了服务提供者里控制器类里的hello法律依据被服务调用者调到。