上一篇文章讲述 SpringCloud2.0 注册中心Eureka单机和集群配置 (一) 本篇讲述 注册中心与服务注册
第四部:服务注册:springcloud-2.0-eureka-provider
鼠标选中springcloud-2.0-eureka-parents 项目,右键创建Maven Model 模块
点击下一步:NEXT
点击FINISH 创建服务提供者模块成功。
第五步:配置服务提供者
pom.xml 配置:
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zeronode</groupId>
<artifactId>springcloud-2.0-eureka-parents</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springcloud-2.0-eureka-provider</artifactId>
<name>springcloud-2.0-eureka-provider</name>
<dependencies>
<!-- 添加服务治理依赖包,eureka-server 服务注册与发现 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
appliaction.properties 配置信息
# 服务端口号
server.port= 8090
# 定义service-id 名称
spring.application.name=eureka-provider
# 指定当前服务提供者到注册中心
eureka.client.service-url.defaultZone=http://192.168.2.120:8080/eureka
启动类到配置:AppProvider
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaClient
@SpringBootApplication
public class AppProvider {
public static void main(String[] args) {
SpringApplication.run(AppProvider.class, args);
}
}
编写一个服务提供到rest接口测试类: ApiUserController
package com.zeronode.api.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/user")
public class ApiUserController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/getUserInfo")
public String getUserInfo() {
return "获取会员信息到服务器端口号:" + serverPort;
}
}
启动服务提供模块完成,再次访问注册中心,当前到Application 状态
此时看到刚刚启动到服务提供者已经注册到EUREKA注册中心并显示当前到服务端口和service-id名称,服务提供者已经启动完成
第六步:创建服务消费者模块:springcloud-2.0-eureka-consumer
鼠标选中pom.xml项目,右键创建Maven Model 模块
点击下一步NEXT,不需要修改信息,直接点击FINISH即可
第七步:配置服务消费者
pom.xml 配置:
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zeronode</groupId>
<artifactId>springcloud-2.0-eureka-parents</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springcloud-2.0-eureka-consumer</artifactId>
<dependencies>
<!-- 添加服务治理依赖包,eureka-server 服务注册与发现 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 添加ribbon 负载均衡组件依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
appliaction.properties 配置信息
# 服务端口号
server.port= 9002
# 定义service-id 名称
spring.application.name=eureka-consumer
# 指定当前服务提供者到注册中心
eureka.client.service-url.defaultZone=http://192.168.2.120:8080/eureka
启动类到配置: AppConsumer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaClient
@SpringBootApplication
public class AppConsumer {
public static void main(String[] args) {
SpringApplication.run(AppConsumer.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
编写一个服务消费者rest接口测试类: UserController
package com.zeronode.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
/**
* 这种方式是rpc远程调用,没有经过注册中心调用
* 同时存在问题:在代码中固定服务到IP和端口,不易维护
* @return
*/
@GetMapping("/getUserInfo")
public String getUserInfo(){
String str = restTemplate.getForObject("http://192.168.2.120:8090/api/user/getUserInfo", String.class);
return str;
}
}
启动服务消费者模块,再次查看EUREKA注册中心界面
此时注册中心包含服务提供者和服务消费者应用服务信息
在浏览器访问 :http://localhost:9002/user/getUserInfo 显示说明服务正常调用成功,为了避免代码中固定请求服务到ip和端口,才起调用service-id方式访问,代码修改如下:
1)修改 服务消费者到Controller代码:UserController
package com.zeronode.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
/**
* 这种方式是rpc远程调用,经过注册中心调用
* 需要注意,在rest调用需要在注入restTemplate 时候添加 @LoadBalanced 注解
* @return
*/
@GetMapping("/getUserInfo")
public String getUserInfo(){
String str = restTemplate.getForObject("http://EUREKA-PROVIDER/aip/user/getUserInfo", String.class);
return str;
}
}
这种方式相对于第一种方式就很好处理ip和端口固定问题,到这里还没有完,一旦使用service-id调用远程服务,就需要在restTemplate 注入上添加@LoadBalanced 注解可以达到负载均衡效果
启动类:AppConsumer 修改
package com.zeronode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class AppConsumer {
public static void main(String[] args) {
SpringApplication.run(AppConsumer.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
项目目录结果:
查考资料:
Finchley版本的官方文档如下:
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html
Finchley版本的中文文档如下:
https://springcloud.cc/spring-cloud-dalston.html#_spring_cloud_netflix