我的后端学习大纲
SpringCloud学习大纲
1.使用Consul后,服务架构设计:

2.实现把支付服务provider8001注册到consul中
2.1.改POM:
 <!--SpringCloud consul discovery -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.2.改YML

2.3.改主启动类:
- 1.添加了注解:@EnableDiscoveryClient,开启服务发现
@SpringBootApplication
@MapperScan("com.jianqun.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient
public class Main8001
{
    public static void main(String[] args)
    {
        SpringApplication.run(Main8001.class,args);
    }
}
2.4.验证测试:

3.实现把订单服务80注册到consul:
3.1.改POM:
 <!--SpringCloud consul discovery -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
3.2.改YML:
server:
  port: 80
spring:
  application:
    name: cloud-consumer-order
    
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
3.3.改主启动类
- 1.添加了注解:@EnableDiscoveryClient,开启服务发现
@SpringBootApplication
@MapperScan("com.jianqun.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient
public class Main8001
{
    public static void main(String[] args)
    {
        SpringApplication.run(Main8001.class,args);
    }
}
3.4.修改Controller:
-  1.未使用consul之前:在controller层上的 public static final String PaymentSrv_URL = "http://localhost:8001";是属于写死的硬编码
  
-  2.使用Consul之后:我们可以把写死的ip地址改成服务的名称,即改为 public static final String PaymentSrv_URL = "http://cloud-payment-service,在改成服务注册中心上的微服务名称后,无论ip地址怎么变化,就不会影响服务
@RestController
public class OrderController
{
    //public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码
    public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求
     * 我们模拟消费者发送get请求,but底层调用post方法,客户端消费者参数PayDTO可以不添加@RequestBody
     * @param payDTO
     * @return
     */
    @GetMapping("/consumer/pay/add")
    public ResultData addOrder(PayDTO payDTO)
    {
        return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);
    }
    // 删除+修改操作作为家庭作业,O(∩_∩)O。。。。。。。
    @GetMapping("/consumer/pay/get/{id}")
    public ResultData getPayInfo(@PathVariable Integer id)
    {
        return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/"+id, ResultData.class, id);
    }
}
3.5.验证测试

4.访问接口测试:
4.1.测试地址:
- 1.发送请求:http://localhost/consumer/pay/get/10,发现报错如下:
  
1.原因是:
consul默认是支持负载均衡的,当通过微服务的别名进行调用的时候,默认被调用的服务应该是集群版本,应该是由多个服务可以选择被调用,但是目前只有一个服务,所以就报错了;
2.要解决这个问题,就是在调用注册中心的服务的时候,添加上负载均衡注解@LoadBalanced,注解@LoadBalanced代表实现负载均衡:
4.2.配置Bean去实现负载均衡:
- 1.这里调用服务是通过RestTemplate 实现的,所以配置注解来实现负载均衡调用
  
@Configuration
public class ApplicationContextBean
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}



















