我的后端学习大纲
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();
}
}