接上文:搭建springcloud项目——简单明了(二)
UserServiceImpl类
@Service @Transactional public class UserServiceImpl implements UserService { //注入用户Mapper @Autowired private UserMapper userMapper; //查询所有用户 public List<User> getAllUsers() { return this.userMapper.getAllUsers(); } //删除用户 public void deleteUser(Integer id) { System.out.println("删除了id为"+id+"的用户"); this.userMapper.delete(id); }
UserService接口
public interface UserService { //查询所有 List<User> getAllUsers(); //删除数据 void deleteUser(Integer id); }
UserController类
@RestController @RequestMapping("/user") public class UserController { //注入用户Service @Autowired private UserService userService; //查询所有用户 @RequestMapping("/userList") public List<User> getAllUsers(){ List<User> list = this.userService.getAllUsers(); return list; } //删除用户 @RequestMapping("/delete/{id}") public void delete(@PathVariable Integer id){ this.userService.deleteUser(id); }
然后检查eureka-user的Controller
然后按顺序分别启动eureka-server、eureka-order、eureka-user
然后访问:http://localhost:8000/findOrdersByUser/1
如图
这样就证明访问成功了
Ribbon
Ribbon是用来实现负载均衡的
首先我们在eureka-user中Application的@Bean下加注解@LoadBalanced
,加了这个注解后RestTemplate就具有了负载均衡能力。
然后将eureka-user中的UserController进行如下修改
我们将之前的“主机地址+端口号”变成了实例名称
在order中写一个工具类
@Configuration public class ServiceInfoUtil implements ApplicationListener<EmbeddedServletContainerInitializedEvent> { /** * 声明event对象,该对象用于获取运行服务器的本地端口 */ private static EmbeddedServletContainerInitializedEvent event; public void onApplicationEvent( EmbeddedServletContainerInitializedEvent event){ ServiceInfoUtil.event = event; } /** * 获取端口号 */ public static int getPort(){ int port = event.getEmbeddedServletContainer().getPort(); return port; }
然后在userList接口中写一个输出,这是用来输出端口号
然后将eureka-order先启动一次,再把端口号该为7901再启动一次
可以看到启动了两个order服务
然后我们访问http://localhost:8000/findOrdersByUser/1
我们多访问几次,然后看输出
我们可以看到,这两个不同端口的order都访问到了,证明Ribbon实现了负载均衡机制。
eureka-user-hystrix
接下来我们写hystrix模块,简单了来说就是熔断器模块,因为在系统中例如c服务调用b服务,然后b服务调用a服务,假如a服务出现问题,那么会导致b服务出现问题,然后再导致c服务出现问题,最终整个系统全部瘫痪,为了解决这个问题就出现了熔断器。
1、新建eureka-user-hystrix模块,步骤和上面的其他模块一样,pom.xml中添加如下配置。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--Hystrix依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
yml文件如下
server: port: 8030 eureka: instance: prefer-ip-address: true client: service-rul: defaultZone: http://localhost:8761/eureka/ spring: application: name: eureka-user-hystrix
新建启动类
@SpringBootApplication @EnableCircuitBreaker @EnableEurekaClient public class Application { public static void main(String [] args){ SpringApplication.run(Application.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
新建UserController,代码中的fallbackInfo方法就是在指定的服务出现问题不能访问的时候就会走这个方法,当指定的服务问题解决以后又会自动再访问指定的访问,这里是自动熔断与连接的。
@RestController public class UserController { @Autowired private RestTemplate restTemplate; /** * 查找与用户相关的订单 */ @GetMapping("/findOrdersByUser/{id}") @HystrixCommand(fallbackMethod = "fallbackInfo") public String findOrdersByUser(@PathVariable String id){ return this.restTemplate.getForObject("http://eureka-order/user/userList", String.class); } /** * 返回信息方法 */ public String fallbackInfo(@PathVariable String id){ return "服务不可用,请稍后再试!"; } }
现在我们来依次启动项目,order启动两个,分别为7900和7901
启动后访问http://localhost:8761/ 如下图证明启动成功
然后访问http://localhost:8030/findOrdersByUser/1 如下图
然后我们就多访问几次,发现访问正常,而且负载也正常
这个时候我们停掉7901的服务
然后我们再次刷新之前的路径,当负载到7901的接口的时候出现下图证明成功
然后我们再启动7901服务后,再次访问就不会出现上图情况,证明我们熔断器配置成功。
gateway-zuul
接下来我们创建zuul(网关)模块,网关可以用来执行认证、动态路由、安全和动态响应等功能,这里主要讲一下动态路由。
新建gateway-zuul,pom.xml配置如下
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
yml配置如图
新建启动类
@EnableZuulProxy @SpringBootApplication @EnableEurekaClient public class Application { public static void main(String [] args){ SpringApplication.run(Application.class, args); } }
然后我们依次启动注册中心(eureka-server)、服务提供者(eureka-order)、网关服务(gateway-zuul)
然后我们访问 http://localhost:7900/order/1
出现下图证明成功
config-server
接下来我们创建配置模块,因为我们以后可能随着业务越来越大,我们会从单体系统升级为分布式系统,但是我们每一个模块都有一个配置文件,这样我们要修改一个模块的配置文件,就需要找到该模块的所有文件,一个一个修改。