目录
Spring Cloud Alibaba专栏目录(点击进入…)
微服务场景模拟
首先,需要模拟一个服务调用的场景,搭建两个工程: service-provider(服务提供方)和service-consumer(服务调用方)
①服务提供方:使用mybatis操作数据库,实现对数据的增删改查;并对外提供rest接口服务
②服务消费方:使用restTemplate远程调用服务提供方的rest接口服务,获取数据
服务提供者
新建一个模块:service_provider,对外提供根据id查询的服务
1.使用STS工具快速创建Spring Boot项目(需要JDBC、MySql、MyBatis启动器)
2.在Pom中引入依赖
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 自带Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- Mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<!-- Spring Boot自带 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.application.yml配置
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mbsmvc
username: root
password: 123456
mybatis:
type-aliases-package: cn.qm.pojo
mapper-locations: classpath:mapper/*Mapper.xml
4.实体类(User)
public class User {
private Integer id;
private String username;
private String pwd;
//省略Getter/Setter方法
}
5.Mapper(UserMapper)
@Mapper
@Repository
public interface UserMapper{
public User getUserById(Integer id);
}
6.映射文件(UserMapper.xml)
<mapper namespace="cn.qm.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
7.业务接口
public interface UserService {
public User getUserById(Integer id);
}
8.业务实现类
@Service
public class UserServiceUmpl {
@Autowired
private UserMapper userMapper;
public User getUserById(Integer id){
return this.userMapper.getUserById(id);
}
}
9.控制器
@Controller
@ResponseBody
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Integer id){
System.out.println("1111");
return this.userService.getUserById(id);
}
}
启动并测试,访问接口:http://localhost:8081/user/1
服务调用者(provider)
1.使用STS工具快速创建Spring Boot项目(只需要Web启动器即可)
2.在Pom文件中导入依赖
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.配置application.yml
server:
port: 8082 //端口
4.在Spring Boot引导类(启动类)中注入RestTemplate
@SpringBootApplication
public class ServiceConsumerApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
// Spring Boot启动类
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
5.实体类
public class User {
private Integer id;
private String username;
private String pwd;
// 省略getter/settter方法
}
6.控制器(UserController )
@Controller
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/user")
@ResponseBody
public User getUserById(@RequestParam("id") Integer id){
return this.restTemplate.getForObject("http://127.0.0.1:8081/user/"+id,User.class);
}
}
启动并访问路径:http://localhost:8082/consumer/user?id=1
微服务模拟存在的问题?
(1)在consumer中,把url地址硬编码到了代码中,不方便后期维护
(2)consumer需要记忆proider的状态,如果出现变更,可能得不到通知,地址将失效
(3)consumer不清楚provider的状态,服务宕机也不知道
(4)provider只有一台访问,不具备高可用性
(5)即便provider形成集群,consumer还需自己实现负载均衡
分布式服务面临的问题?
(1)服务管理
如何自动注册和发现
如何实现状态监管
如何实现动态路由
(2)服务如何实现负载均衡
(3)服务如何解决容灾问题
(4)服务如何实现统一配置
以上问题都将在Spring Cloud中得到解决