浅谈SpringCloud (二) Eureka服务发现组件
上面学习到了如何由一个程序访问另一个程序,那么如果使用SpringCloud来进行访问,该如何访问呐?
可以借助Eureka服务发现组件进行访问。
可以借助官方文档:https://spring.io/projects/spring-cloud 。 中文文档:https://springcloud.cc/
1.服务发现
服务中心
服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。
就第一个例子来说,项目A调用项目B
正常调用:
有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用:
Eureka
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。
Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
上图是github了Eureka的基本架构:Eureka Server提供服务注册和发现。其他的应用客户端。
SpringCloud的Eureka服务
1.将项目变成 SpringCloud项目,父容器添加依赖。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2.新建一个eureke的maven工程eureka-server项目。
<?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"> <parent> <artifactId>springclouddemo</artifactId> <groupId>com.aomeibox</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eureka</artifactId> <name>eureka</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- eureka-server 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>1.4.4.RELEASE</version> </dependency> <!-- 安全依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> </project>
配置主函数,设置成Eureka Server,并启动项目并运行。
@SpringBootApplication @EnableEurekaServer public class EurekaApp { public static void main( String[] args ) { SpringApplication.run(EurekaApp.class); } }
访问eureka的时候需要输入用户名和密码,默认用户名是user,密码则需要从控制台查找,SpringCloud生成了一个随机默认的。
如果需要修改用户名和密码,则需要重新配置application.yml文件中的信息。
server:
port: 10000
#以为当前的eureka是单机的,所以需要设置一些配置
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://root:123@localhost:10000/eureka
# defaultZone: http://192.168.1.125:10000/eureka/
security:
basic:
enabled: true #开启安全配置,也就是需要安全密码,如果不需要,设置为false即可,注意,这个参数必须放在application.yml中,不允许放在bootstrap.yml中
user:
name: root
password: 123 #在配置了用户的用户名和密码后,可以修改访问地址为curl风格
消费者和服务提供者注册到Eureka中
1.修改provider项目的pom.xml文件。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>1.4.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
2.修改主函数。
@SpringBootApplication @EnableEurekaClient //启用 eureka 客户端 public class ProviderUser { public static void main( String[] args ) { SpringApplication.run(ProviderUser.class); } }
3.启动eureka服务和provider,可以看到已经注册到Eureka中了。
4.编写conroller类,进行测试
@RestController public class UserController { @Autowired private EurekaClient eurekaClient; @GetMapping("/user/{id}") public User getUser(@PathVariable Integer id){ return new User(id); } @GetMapping("/eurekaInfo") public String info(){ InstanceInfo eureka = eurekaClient.getNextServerFromEureka("provider-user", false); return eureka.getHomePageUrl(); } }
5.customr如上修改。就会有两个项目注册到Eureka中了。
6.修改customer中的controller代码。再次访问,还是能拿到provider项目提供的数据的。
@RestController public class OrderController { @Autowired private RestTemplate template;//spring提供的一个用于访问rest接口的模板对象 private String url = "http://192.168.1.125:7900/user/"; @Autowired private EurekaClient eurekaClient; @GetMapping("/order/{id}") public User getUser(@PathVariable Integer id){ InstanceInfo eureka = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false); //访问提供者获取数据 User user = template.getForObject(eureka.getHomePageUrl()+"/user/"+ id, User.class);//通过访问rest 获取到json数据,然后转换成User对象 return user; } }