当前位置:   article > 正文

Eureka 服务注册与消费(超详细)_eureka 收费吗

eureka 收费吗

1.服务注册

服务注册就是把一个微服务注册到 Eureka Server 上,当其它服务需要调用该服务时,只需从 Eureka Server 上查询该服务的信息即可。

下面创建一个provider,作为服务提供者,创建项目时,选择Eureka Client 依赖,这样,当服务创建成功后,简单配置一下,就可以被注册到Eureka Server 上了。

项目创建成功后,只需在 application.properties 中配置一下项目的注册地址即可。注册地址的配置,和 Eureka Server 集群的配置很像。配置如下:

  1. spring.application.name=provider
  2. server.port=1113
  3. eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka

 然后启动 Eureka Server ,待服务注册中心启动后,再启动provider。两者启动成功后,浏览器输入 http://localhost:1111,就可以看到provider的注册信息,如下:

2.服务消费 

2.1基本用法

首先提供者创建访问接口,然后创建消费者,消费这个访问接口(在provider中提供一个hello接口):

  1. @RestController
  2. public class HelloController {
  3. @GetMapping("/hello")
  4. public String hello(){
  5. return "hello 你好";
  6. }
  7. }

 然后,创建一个consumer 项目,consumer 去消费provider提供的接口。consumer 想要获取到 provider 这个接口的地址,他就去 Eureka Server 中查询,如果直接在 consumer 中写死 provider地址,意味着这两个服务之间的耦合度就太高了,我们要降低耦合度。先看一个写死的调用:

创建一个consumer 项目,添加web 和 eureka client 依赖:

 创建成功后,在 application.properties 中配置一下项目的注册地址。配置如下:

  1. spring.application.name=consumer
  2. server.port=1115
  3. eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka

配置完成后,假设我们在 consumer 中调用 provider 提供的服务,我们可以直接将调用写死,就是说,整个调用过程不会涉及到 Eureka Server。

  1. /** 测试死的地址访问
  2. * */
  3. @GetMapping("/hello1")
  4. public String hello1() throws MalformedURLException {
  5. HttpURLConnection con = null;
  6. try {
  7. URL url = new URL("http://127.0.0.1:1113/hello");//这里测试写死provider地址,耦合度太高
  8. con = (HttpURLConnection) url.openConnection();
  9. if(con.getResponseCode() == 200){
  10. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
  11. String s = bufferedReader.readLine();
  12. bufferedReader.close();
  13. return s;
  14. }
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. return "error";
  19. }

浏览器访问如下,调用成功:

这是一段利用了 HttpURLConnection 来发起的请求,请求中的 provider 地址写死了,意味着 provider 和 consumer 高度绑定在一起,耦合度太高。

2.2 消费的接口改造

要改造它,我们借助 Eureka Client 提供的 DiscoveryClient 工具,根据服务名从 Eureka Server 上查询到一个服务的详细地址,改造后的代码如下:

  1. @Autowired
  2. DiscoveryClient discoveryClient;
  3. @GetMapping("/hello2")
  4. public String hello2(){
  5. List<ServiceInstance> list = discoveryClient.getInstances("provider");
  6. ServiceInstance serviceInstance = list.get(0);
  7. String host = serviceInstance.getHost();
  8. int port = serviceInstance.getPort();
  9. StringBuffer sb = new StringBuffer();
  10. sb.append("http://")
  11. .append(host)
  12. .append(":")
  13. .append(port)
  14. .append("/hello");
  15. HttpURLConnection connection = null;
  16. try {
  17. URL url = new URL(sb.toString());
  18. connection = (HttpURLConnection) url.openConnection();
  19. if (200 == connection.getResponseCode()) {
  20. BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  21. String s = reader.readLine();
  22. reader.close();
  23. return s;
  24. }
  25. } catch (MalformedURLException e) {
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. return "error";
  32. }

 重新启动项目,浏览器访问如下:

 2.3 集群化部署和简单的负载均衡

 DiscoveryClient查询到的服务列表是一个集合,因为服务在部署的过程中,可能是集群部署,集合中的每一项就是一个实例。

集群化部署:

1.修改 provider 中的 hello 接口【因为要启动多个provider 实例,多个实例端口则不同,用端口直接区分每个provider 提供的服务】:

  1. public class HelloController {
  2. @Value("${server.port}")
  3. Integer port;
  4. @GetMapping("/hello")
  5. public String hello(){
  6. return "hello 你好" + port;
  7. }
  8. }

修改完成后,对 provider 进行打包,打包后在IDEA命令行启动两个 provider 实例 【集群】:

  1. java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1113
  2. java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1116

 启动完成后,访问注册中心看有没有注册上来。然后再去调用provider ,DiscoveryClient 集合中,获取到的就不是一个实例了,而是两个实例。这里我们可以手动实现一个负载均衡:

  1. int count = 0;
  2. @GetMapping("/hello3")
  3. public String hello3(){
  4. List<ServiceInstance> list = discoveryClient.getInstances("provider");
  5. ServiceInstance serviceInstance = list.get((count++) % list.size());
  6. String host = serviceInstance.getHost();
  7. int port = serviceInstance.getPort();
  8. StringBuffer sb = new StringBuffer();
  9. sb.append("http://")
  10. .append(host)
  11. .append(":")
  12. .append(port)
  13. .append("/hello");
  14. HttpURLConnection connection = null;
  15. try {
  16. URL url = new URL(sb.toString());
  17. connection = (HttpURLConnection) url.openConnection();
  18. if (200 == connection.getResponseCode()) {
  19. BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  20. String s = reader.readLine();
  21. reader.close();
  22. return s;
  23. }
  24. } catch (MalformedURLException e) {
  25. e.printStackTrace();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. return "error";
  31. }

在target文件上右键open in terminal 分别输入java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1113 、

java -jar provider-0.0.1-SNAPSHOT.jar --server.port=1116启动两个provider ,打开Eureka Server如下图:已经注册成功。

 

接着访问http://localhost:1115/hello3,如下图【多次访问端口已改变】,已实现线性负载均衡

 

 2.4 升级改造

 主要从两方面动手:

  1. http调用:spring提供RestTemplate
  2. 负载均衡 : Ribbon

 2.4.1 http调用

 用spring提供RestTemplate来实现,以下提供一个实例:

  1. @SpringBootApplication
  2. public class ConsumerApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(ConsumerApplication.class, args);
  5. }
  6. @Bean
  7. RestTemplate restTemplateOne(){
  8. return new RestTemplate();
  9. }
  10. }

 将HttpURLConnection以及下面的那一段用RestTemplate替换,一行代码实现http调用,如下:

  1. @Autowired
  2. DiscoveryClient discoveryClient;
  3. @Autowired
  4. @Qualifier("restTemplateOne")
  5. RestTemplate restTemplateOne;
  6. @GetMapping("/hello2")
  7. public String hello2(){
  8. List<ServiceInstance> list = discoveryClient.getInstances("provider");
  9. ServiceInstance serviceInstance = list.get(0);
  10. String host = serviceInstance.getHost();
  11. int port = serviceInstance.getPort();
  12. StringBuffer sb = new StringBuffer();
  13. sb.append("http://")
  14. .append(host)
  15. .append(":")
  16. .append(port)
  17. .append("/hello");
  18. String s = restTemplateOne.getForObject(sb.toString(), String.class);
  19. return s;
  20. }

2.4.2 开启负载均衡 

 使用 Ribbon 来快速实现负载均衡。只需要给 RestTemplate 实例添加一个 @LoadBalanced 注解,开启负载均衡:

  1. @Bean
  2. @LoadBalanced //【客户端负载均衡】
  3. RestTemplate restTemplate(){
  4. return new RestTemplate();
  5. }

调用代码如下:

  1. @Autowired
  2. @Qualifier("restTemplate")
  3. RestTemplate restTemplate;
  4. @GetMapping("/hello3")
  5. public String hello3(){
  6. //restTemplate有负载均衡功能,直接给服务名调用就行
  7. return restTemplate.getForObject("http://provider/hello",String.class);
  8. }

接着访问http://localhost:1115/hello3,如下图:

 

 给RestTemplate添加负载均衡的注解也可以理解为RestTemplate = http调用 + 负载均衡。

 项目实例地址:https://github.com/astronger/springcloud-simple-samples

 

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/733590
推荐阅读
相关标签
  

闽ICP备14008679号