一、介绍
eureka 作为服务注册中心,保存微服务的IP、端口等要信息。
二、搭建服务eureka 服务注册中心
采用spring-boot搭建项目,maven 镜像采用了阿里云,这样下载Jar包快一点
- 新建一个spring-boot项目作为注册中心(项目名:eureka)
修改pom.xml文件,引入jar包
<dependencyManagement>
//声明了spring-cloud 相关jar的版本(只是声明)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
//spring-cloud为我们定义了版本号,可以借助IDE点进去看下
<artifactId>spring-cloud-dependencies</artifactId>
//spring-cloud 版本
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
- 配置文件
这里采用的是yml文件来配置,yml 充当配置文件比起properties文件的话,格式相对好看一点(-。-)
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
//注册自己到注册中心(因为eureka 可以搭建集群,这里设为false)
register-with-eureka: false
//是否从eureka 注册中心拉取注册信息
fetch-registry: false
- @EnableEurekaServer
在spring-boot 启动类加上这个注解
@SpringBootApplication//spring-boot 应用程序
@EnableEurekaServer//激活服务注册服务
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
二、注册服务
注册一个服务作为服务提供者
- 新建 spring-boot 项目(项目名:movie)
修改pom.xml 文件,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
- 配置文件
server:
port: 9000
context-path: /movie
application:
name: movie-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true
instanceId: ${spring.application.name}:${server.port}
- 注册服务
使用@EnableEurekaClient注解 ,注册服务
@SpringBootApplication
@EnableEurekaClient
public class MovieApplication {
public static void main(String[] args) {
SpringApplication.run(MovieApplication.class, args);
}
}
- 创建 Movie 服务
此服务被 UserController 调用
@RestController
public class MovieController {
@Resource
private MovieRep movieRep;
@GetMapping("list")
public List<Movie> movies(){
List<Movie> list = movieRep.findAll();
return list;
}
}
三、调用服务
- 新建一个用户微服务spring-boot项目(项目名:user)
修改pom.xml 文件,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
-
配置文件
server: port: 9002 context-path: /user spring: application: eureka: client: service-url: defaultZone: http://localhost:8761/eureka instance: instanceId: ${spring.application.name}:${server.port}
配置负载均衡
服务之间调用采用的是Http协议
@EnableEurekaClient 使用此注解在 UserApplication 类上
@LoadBalanced 让RestTemplate拥有负载均衡能力
@RibbonClient 使用 ribbon 作负载均衡
@SpringBootApplication
@EnableEurekaClient //声明是一个 eureka 客户端,用于接取已注册的微服务信息
@RibbonClient //使用 ribbon 作负载均衡
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
@Bean
@LoadBalanced // 让RestTemplate 使用配置的ribbon负载均衡调取微服务
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 调用服务
restTemplate.getForObject(url, List.class);
参数1:被调用服务的url,使用 "被调用服务名" + uri,eg:http://movie-service/movie/list
参数2:返回对象调用时需要 被调用服务的一些信息,如:ip、端口,现在这些信息全部保存在注册中心,只有从注册中心拉取就好了,这样ip、端口全部是多态的。
@RestController
public class UserController {
@Resource
private RestTemplate restTemplate;
@Resource
private LoadBalancerClient loadBalancerClient;
@GetMapping("movieList")
public List getMovieList() {
String url = "http://movie-service/movie/list";
// String url = "http://localhost:9001/movie/list";
List forObject = restTemplate.getForObject(url, List.class);
System.out.println("request");
return forObject;
}
}