为什么要用为服务?这是一个面试官问我的问题;
我们传统的开发是将所有功能都集成在一个项目中,打成jar包或者war包上传至服务器;这样做的缺点就是系统太过笨重;就如同一个巨型机器人,体积太过庞大,而一旦一个部位出问题,整个系统就可能崩溃,耦合度太紧密;
而微服务就如同无数纳米机器人合成的一个巨型机器人,可修复性非常强;一个部分出错不会影响整个系统。
那么它是怎么实现的呢?
springcloud 的实现是将所有的服务都注册在一个主服务器上(当然也可以有好几台主服务器相互注册调用),然后通过该主服务器进行调配调用,每个服务器有不同的分工;分工明确,便于开发。(一个小组只负责一个服务端的开发即可)
这样服务器就建好了;接下来需要在启动类上加上@EnableEurekaServer注解,开启Eureka服务;
#配置端口
server:
port: 8888
eureka:
instance:
hostname: eureka-server
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:${server.port}/eureka/
spring:
application:
name: eurka-server
register-with-eureka表示是否在eureka服务器上注册,我们现在配置的就是服务器,所以设置为false(默认为true)fetch-registry也设置为false;
service-url设置该服务器的地址;spring.application.name设置主机名;
设置完毕之后,我们就可以启动项目了;启动后浏览器可访问eureka的启动界面;
访问地址:http://localhost:8888
我们可以看到如下界面:
现在我们还没有创建client服务,所以application下什么都没有;
3. 接下来我们创建client服务器:
步骤跟上边差不多;唯一不同的是我们要选中eureka client
spring:
application:
name: client01
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8888/eureka/
server:
port: 8889
spring.application.name很重要,后边服务器的调配调用需要用到它
此处的serviceURL是要注册的服务器主机(也就是eurekaServer的地址)表示要本服务注册到的服务地址;
启动服务;我们的eurekaclient就注册完成了;
在http://localhost:8888 查看,就会发现已经注册的服务器:
相同的步骤,我们需要用到两个服务器;
第二台服务器我们命名为client02,端口我们设置成9999;
创建好之后主服务器service的Eureka页面是这样的:
服务器注册完之后,那么该如何进行服务器之间的访问
互通呢?
首先当然是引入pom文件了;这里我们用的是FeignClient;pom依赖如下:
>
>org.springframework.cloud >
>spring-cloud-starter-openfeign >
>
feignClient的用法很简单;主要用于服务网之间的数据传输,并保持数据格式不变;
package com.example.eurekaclient.eurekaclient.entity; /**
* @ClassName UserInfo
* @Author will
* @Date 2019/10/30 11:24
**/ public class UserInfo {
private int userId;
private String userName;
private String userAddress;
private int userAge; public UserInfo() {
}
public UserInfo(int userId, String userName, String userAddress, int userAge) {
this.userId = userId;
this.userName = userName;
this.userAddress = userAddress;
this.userAge = userAge;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQSFCdQx-1572834724967)($resource/)]
该类必须要有默认的构造函数,即无参构造函数;否则传输过来之后feignClient会无将其法解析成为实体类
2. 在eurekaclient上创建controller,用于被访问:
@RestController
@RequestMapping("test")
public class mycontoller {
@GetMapping("/eureka02")
public List<UserInfo> getEureka(){
System.out.println(" \n----------------This is Eureka02");
List<UserInfo> list =new ArrayList<>();
list.add(new UserInfo(1,"zhangsan","上海",12));
list.add(new UserInfo(2,"lisi","江西",20));
list.add(new UserInfo(3,"lilei","Ama",21));
return list;
}
}
这样当另一个服务器cloudclient访问 /test/eureka02时就会返回我们创建的三个用户;
3. 在cloudclient中创建接口,进行数据访问;
首先要在启动类上加上@EnableFeignClients:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class Client02Application {
public static void main(String[] args) {
SpringApplication.run(Client02Application.class, args);
}
}
然后创建访问接口,UserFeginClient接口;
@FeignClient("client01")
public interface UserFeginClient {
@GetMapping("/test/all")
List<UserInfo> getAllUsers();
}
这里的@FeignClient(“client01”)中的“client01”就是我们要访问的目标主机名;
4. 创建对外的访问Controller;
@RestController
public class MainController {
@Autowired
private UserFeginClient userFeginClient;
@GetMapping("/hi")
public List<UserInfo> getAllUsers(){
return userFeginClient.getAllUsers();
}
}
至此,我们一个简单的分布式服务器就建完了;下来看一下测试:
访问地址http://localhost:9999/hi
一般来说搭建微服务还需要配置网关,将自己的一些后台服务放置于内网中,向外只露出与用户直接交互的接口,这样更为安全;