视频学习指路–黑马程序员微服务技术栈
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
拆分的注意事项:
1.不同的微服务,不要重复开发相同的业务
2.微服务的数据库之间独立,不要访问其他微服务的数据库
3.微服务可以将自己的业务暴露为借口,供其他微服务调用

如图所示的远程调用:订单模块和用户模块各自拥有属于自己的数据库,各自模块独立,现在使得订单模块可以类似于浏览器的地址栏一样通过url的方式访问用户模块,来获得用户模块的信息,从而拼接成自己需要的信息。
RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更为优雅的调用RESTFul服务的方式。RestTemplate简介原文连接
基于RestTemplate发起的http请求实现远程调用,http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
1.注册RestTemplate
(bean的注入应该放置到配置类当中,@Configuration和@SpringBootApplication所在的类都属于配置类)
package com.titi.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@MapperScan("com.titi.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate并注入Spring容器
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.修改order-service中的OrderService的queryOrderById方法
package com.titi.order.service;
import com.titi.order.mapper.OrderMapper;
import com.titi.order.pojo.Order;
import com.titi.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate发起http请求,查询用户
//2.1 url路径
String url="http://localhost:8081/user/"+order.getUserId();
//2.2 发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 4.返回
order.setUser(user);
return order;
}
}


eureka注册中心的搭建
1、创建项目,引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
2、编写启动类,添加@EnableEurekaServer注解
package com.titi.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
3、添加application.yml文件,编写配置
server:
port: 10086 #服务端口
spring:
application:
name: eurekaserver #eureka的服务名称
eureka:
client:
service-url: #eureka的地址信息
defaultZone:http://127.0.0.1:10086/eureka
注意:在访问页面的时候,直接输入http://ip地址:端口号即可,不要输入成http://ip地址:端口号/eureka,否则页面显示不出来(卡了一下午,我。。。。。。)
eureka-client端的搭建:user-service
1、在对应模块添加依赖
<!--eureka客户端的依赖-->
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2、user-service的application.yml中添加配置
spring:
application:
name: userservice #user服务的服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
eureka-client端的搭建:order-service同理

另外,可以将user-service多次启动,模拟多实例部署,但是我了避免端口冲突,需要修改端口设置

服务拉取是基于服务名称拉取服务列表,然后在对服务列表做负载均衡
1、修改OrderService的代码,将带有ip地址和主机号的url修改成服务名称
2、在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注释
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
1、负载均衡流程


2、负载均衡规则的修改
通过定义IRule可以实现修改负载均衡规则,有两种方式
1、代码方式:在order-service中的OrderApplication类中定义一个新的IRule。这种方式是全局型的。
@Bean
public IRule randomRule(){
return new RandomRule();
}
2、配置文件的方式:在order-service的application.yml文件中,添加新的配置也可以修改规则。这种方式是局部的,可以指定服务的名称(指定哪一个微服务采取这种负载均衡策略)
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
饥饿加载:Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载会在项目启动的时候创建,降低第一次访问的耗时,通过配置开启饥饿加载。
在orderservice的配置文件中指定:
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: #指定饥饿加载的服务名称
- userservice