SpringCloud学习二(基于尚硅谷周阳2020最新版SpringCloud教程15-27集)

1. Eureka

1.1 什么是服务治理

1.2 什么是服务注册与发现

1.3 包含两个组件

2. 搭建单机Eureka

2.1 新建Eureka Server模块

  1. 建module
  2. 改pom
  3. 写yml
  4. 主启动
  5. 业务类
  6. 测试 http://localhost:7001/

2.2 将cloud-provider-payment8001设置为Eureka Client并注册进Eureka Server成为服务提供者

  1. 改pom
	<!-- eureka server -->
	<dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  1. 改yml
eureka:
  client:
    #表示向注册中心注册自己 默认为true
    register-with-eureka: true 
    #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true 
    service-url:
      # 入驻地址
      defaultZone: http://localhost:7001/eureka
  1. 主启动添加注解
	@EnableEurekaClient
  1. 测试
  • 需要先启动 Eureka Server:cloud-eureka-server7001
  • 再启动 Eureka Client:cloud-provider-payment8001
  • 访问 http://localhost:7001/

在这里插入图片描述

2.3 将cloud-consumer-order80设置为Eureka Client并注册进Eureka Server成为服务提供者

步骤同上

在这里插入图片描述

3. 搭建集群Eureka

3.1 Eureka集群原理

互相注册,相互守望

3.2 Eureka集群环境搭建

  1. 新建module:复制cloud-eureka-server7001为cloud-eureka-server7002
  2. 修改映射配置文件
  • 找到 C:\Windows\System32\drivers\etc 路径下host文件
  • 添加映射配置

############ spring cloud 2020#########
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

  1. 改yml
# 修改instance.hostname
# 修改client.service-url.defaultZone
# cloud-eureka-server7001
server:
  port: 7001

eureka:
  instance:
    #  单机 hostname: localhost
    # eureka服务端的实例名称,在host文件中查看
    hostname: eureka7001.com

  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 相互注册
      defaultZone: http://eureka7002.com:7002/eureka/

# cloud-eureka-server7002
server:
  port: 7002

eureka:
  instance:
    # eureka服务端的实例名称
    # 单机 hostname: localhost
    hostname: eureka7002.com

  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 相互注册
      defaultZone: http://eureka7001.com:7001/eureka/
  1. 测试
  • 启动cloud-eureka-server7001,访问 http://localhost:7001/
  • 启动cloud-eureka-server7002,访问 http://localhost:7002/
  • 访问 http://eureka7001.com:7001/
  • 访问 http://eureka7002.com:7002/

3.3 将cloud-provider-payment8001和cloud-consumer-order80配置到Eureka集群中

  1. 改yml
# 只修改defaultZone
eureka:
  client:
    service-url:
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka      
  1. 测试
  • 启动Eureka服务
    • cloud-eureka-server7001
    • cloud-eureka-server7002
  • 启动 cloud-provider-payment8001
  • 启动 cloud-consumer-order80
  • 访问测试
    • 访问 http://eureka7001.com:7001/
    • 访问 http://eureka7002.com:7002/
    • 访问 http://localhost/consumer/payment/get/4

在这里插入图片描述
在这里插入图片描述

3.4 支付服务集群环境搭建

  1. 修改 cloud-provider-payment8001 的PaymentController.java
import org.springframework.beans.factory.annotation.Value;

@RestController//@Controller+@ResponseBody
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    //为了说明该次请求是从provider集群中的哪个端口提供的
    @Value("${server.port}")
    private String serverPort;

	//新增
    @PostMapping(value = "/payment/create")
    public CommonResult create(@RequestBody Payment payment) {
        int result = paymentService.create(payment);
        log.info("*****插入结果: " + result);
        if (result > 0) {
            return new CommonResult(200, "插入数据库成功,端口号:" +serverPort, result);
        }
        return new CommonResult(444, "插入数据库失败", null);
    }
	
	//查询
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        Payment payment = paymentService.getPaymentById(id);
        log.info("*****查询结果: " + payment);
        if (payment != null) {
            return new CommonResult(200, "查询成功,端口号:" +serverPort, payment);
        }
        return new CommonResult(444, "没有对应记录,查询ID:" + id, null);
    }
  1. 新建模块 cloud-provider-payment8002,复制cloud-provider-payment8001

3.5 订单服务+负载均衡

  1. 订单服务 PAYMENT_URL 不能写死,修改 OrderController.java
  2. 但是此时请求到 CLOUD-PAYMENT-SERVICE 不知道调用里面哪个微服务
  3. 配置负载均衡

cloud-consumer-order80下ApplicationContextConfig.java

@Configuration
public class ApplicationContextConfig {
	
	@Bean
	@LoadBalanced//添加注解
	public RestTemplate getrRestTemplate() {
		return new RestTemplate();
	}
}

OrderController.java

@RestController
@Slf4j
public class OrderController {
	/**
	 * 	单机版写死,通过RestTemplate进行连接
	 * 	指定cloud-consumer-order80通过8001端口连接cloud-provider-payment8001
	 */
    public static final String PAYMENT_URL = "http://localhost:8001";    
    
    @Resource
    private RestTemplate restTemplate;
    
    /**
     * 	通过在eureka上注册过的微服务(支付服务)名称调用
     * 	但是请求到CLOUD-PAYMENT-SERVICE不知道调用里面哪个微服务
     * 	——>
     * 		使用默认的负载均衡机制
     */
    public static final String EPAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment) {
        return restTemplate.postForObject(EPAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }


    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(EPAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}
  1. 测试
  • 启动Eureka服务
    • cloud-eureka-server7001
    • cloud-eureka-server7002
  • 启动支付服务
    • cloud-provider-payment8001
    • cloud-provider-payment8002
  • 启动订单服务 cloud-consumer-order80
  • 访问测试
    • 访问 http://eureka7001.com:7001/
    • 访问 http://eureka7002.com:7002/
    • 访问 http://localhost/consumer/payment/get/4

可以看到有2个提供者,1个消费者
在这里插入图片描述
多次访问 http://localhost/consumer/payment/get/4,可以看到会随机匹配端口号
在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 10301084 查看本文章

3.6 Actuator微服务信息完善

http://localhost:8001/actuator/health
  1. 问题:暴露主机名称 localhost

  2. 问题:鼠标移到路径上浏览器左下角没有IP信息提示

#  修改application.yml
eureka:
  client:
    xxx
  instance:
    instance-id: payment8001/payment8002
    prefer-ip-address: true

鼠标移到红框处,浏览器左下角会显示ip地址
在这里插入图片描述

3.7 服务发现Discovery

  1. 功能:对于注册进eureka里面的微服务,可以通过服务发现来获得服务的信息
  2. 修改 PaymentController.java
增加:
    //服务发现 获取服务信息
    @Resource
    private DiscoveryClient discoveryClient;
	
	/**
     *	服务发现
     */
    @GetMapping(value = "payment/discovery")
    public Object discovery() {
    	//获得对外暴露的微服务名称
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element:" + element);
        }
        //获得指定微服务名称下的全部实例
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.debug(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + instance.getUri());
        }
        return this.discoveryClient;
    }

  1. 修改 PaymentMain8001.java
添加注解:
	@EnableDiscoveryClient
  1. 测试:访问 http://localhost:8001/payment/discovery

在这里插入图片描述

3.8 Eureka自我保护机制

发布了15 篇原创文章 · 获赞 4 · 访问量 723

猜你喜欢

转载自blog.csdn.net/weixin_38938338/article/details/105174711