公司做新一年计划的时候提到了微服务,以前也总听过微服务,但并没有去了解究竟是什么,放假前查阅了一下相关的资料,做了一个简单的测试,记录一下.
我理解的微服务就是一种不同的分割方式,以前是按照service
,dao
,domain
,controller
来分层的,而微服务是可以通过功能来进行分割的,而且分割出来的功能越简单越好,最多两周内可以修改翻新的.然后可以通过调用某一个服务,来实现微服务这样的一个功能,我测试使用的是springcloud
,springcloud
是很多服务的一个合集,所以不可避免的就出现了版本影响的问题,在官网中有这样的一个描述
Finchley builds and works with Spring Boot 2.0.x, and is not expected to work with Spring Boot 1.5.x.
这个是针对Finchley
版本的,针对其他版本的springcloud
也是一样的,需要注意你引用的spingboot
的版本,不然启动不起来,也不会有什么报错.
而微服务中存在的角色有三种,服务端
,客户端
,注册中心
- 服务端: 用来提供服务的
- 客户端: 用来引用服务端所提供的服务
- 注册中心: 客户端和服务端在注册中心 进行注册 然后进行调用
我在做测试的时候,第一个测试是没有引入springcloud
的,只是两个服务之间的一个调用
新建项目cloud-demo
然后新建module,cloud-service-demo
项目结构如下

没有引入数据库 比较懒 就下了一个service
和 controller
是在list中加入了一条信息
@Service
public class TestServiceImpl implements TestService {
@Override
public List<Map<String, String>> testService()
{
List<Map<String,String>> list = new ArrayList<>();
Map<String,String> map = new HashMap<String, String>();
map.put("testKey","微服务的一个测试");
list.add(map);
return list;
}
}
server-port
是在yml
文件中配置的 配置为1000
然后在新建module
cloud-client-demo
用来调用service的服务
项目结构如下

因为用到了
restTemplate
所以要在配置类中,声明一下.
@Configuration
public class CilentApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
然后在controller
中直接引用就可以了
@RestController
public class ClientController {
@Resource
private RestTemplate restTemplate;
@RequestMapping("/index")
public String clientTest(){
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://localhost:1000/index",String.class);
String result = responseEntity.getBody();
return result;
}
这里我只写了一个客户端,实际是可以写多个 然后通过ngix来解决高并发问题的,但是如果微服务数量很多的时候,这种直接调用的方式,还是会有缺陷的,所以就使用了eureka
新建module
spring-cloud-eureka-server
pom
文件引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
下边的是整个项目的pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后需要在yml文件中进行配置
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
然后将之前写的 服务端 和 客户端 进行注册
eureka:
client:
service-url:
defaultZone: http://localhost:3000/eureka/
instance:
prefer-ip-address: true
eureka:
client:
service-url:
defaultZone: http://localhost:3000/eureka/
instance:
prefer-ip-address: true
spring:
application:
name: cloud-server-demo
启动 localhost:3000

可以看到已经注册成功了
然后controller中新加一个跳转
@RequestMapping("/hello")
public String hello(@RequestParam String id){
return restTemplate.getForObject("http://cloud-server-demo/hello?id="+id,String.class);
}
可以看到是直接通过服务名称进行访问的,不需要链接了.

这样一个简单的微服务就搭建完成了.
网友评论