SpringCloud微服务大纲 02(idea篇)

Ribbon 调用

负载均衡算法

  • 轮循算法

启动两个userService服务

  • 注意:当无法同时运行两个main方法的时候,如下操作

点击进入第一个选项

在这里插入图片描述
右上角把这里的√全部取消掉之后点apply执行
在这里插入图片描述
设置两个不同的端口

server:
  port: 8881
server:
port: 8882

在这里插入图片描述

controller类中可以随便添加一个方法测试

 @GetMapping("/a")
    public String a(){
        return "1";
    }
  • 运行userview服务
    在controller类中添加一个方法调用
 @Autowired
    RestTemplate rt;
    @GetMapping("/a")
    public String a(){
        String url="http://USERSERVICE/a";
        String forObject = rt.getForObject(url, String.class);
        return forObject;
    }
  • 实现以下情况 ,轮流循环1和2
    在这里插入图片描述
    在这里插入图片描述

  • 随机算法(RandomRule)

在userview的main方法的类中添加一个Bean
在这里插入图片描述
重新运行,即可去看效果

  • 在这里也可以自己定义一个rule类,按照自己的规则去定义

  • 注意:创建一个在main方法子类或则同层级的类,否则无法扫描到,还有不要添加任何注解

在这里插入图片描述
需要extends AbstractLoadBalancerRule类,在实现重写

public class MyRule extends AbstractLoadBalancerRule {
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
    @Override
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        List<Server> reachableServers =loadBalancer.getReachableServers();
        return reachableServers.get(0);
    }
}

简单的实现了永远执行第一台服务service;快去试试自己 的规则吧!在这里插入图片描述

  • 注意:这样定义的规则是针对所有人调用的,当微服务多的时候,或者调用其他微服务的时候,会出现一些问题

所以需要去yml配置中添加 —谁需要掉用就写谁的

#微服务的名称
USERSERVICE:
  ribbon:
  NFLoadBalancerRuleClassName: rule.MyRule

当如果都需要的时候就在main方法添加个bean

在这里插入图片描述

Feign调用

这里在userservice中的controller层添加了一个类,取名就叫Empcontroller,这里就用rest风格去实现

@RestController
public class EmpController {
    @GetMapping("/emp/{id}")
    //@PathVariable  获取路劲参数
    public Emp queryEmp(@PathVariable String id){
        Emp emp=new Emp();
        emp.setId(id);
        emp.setName("张三******"+id);
        return emp;
    }

    @PostMapping("/emp")
    public Result add(@RequestBody Emp emp){
       Result result=new Result();
       result.setCode(1);
       result.setMsg(emp.getId()+"----"+emp.getName());
       return result;
    }
    @DeleteMapping("/emp/{id}")
    public Result del(@PathVariable String id){
        Result result=new Result();
        result.setCode(1);
        result.setMsg(id);
        return result;
    }
    @PutMapping("/emp/{id}")
    public Result update(@PathVariable String id,@RequestBody Emp emp){
        Result result=new Result();
        result.setCode(1);
        result.setMsg("修改成功");
        return result;
    }
}

新建了一个新的微服务,entity 可以从上面复制,yml也直接复制就好,不需要改动
在这里插入图片描述

  • 注意userviewF中需要多添加一个属于Feign的注解@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RestController
public class UserViewF {

    public static void main(String[] args) {
        new SpringApplicationBuilder(UserViewF.class).web(true).run(args);
    }

}
  • 因为feign是面向接口编程,所以添加个接口类,注意注解@FeignClient(name=“连接的服务名”)
@FeignClient(name="USERSERVICE")
public interface EmpFeign {

    @GetMapping("/emp/{id}")
    //@PathVariable  获取路劲参数
    public Emp queryEmp(@PathVariable("id") String id);

    @PostMapping("/emp")
    public Result add(Emp emp);

    @DeleteMapping("/emp/{id}")
    public Result del(@PathVariable("id") String id);

    @PutMapping("/emp/{id}")
    public Result update(@PathVariable("id") String id,@RequestBody Emp emp);

}
@RestController
public class EmpController {

    @Autowired
    EmpFeign ef;

    @GetMapping("/query")
    public Emp queryEmp(){
        String id="1";
        Emp emp=ef.queryEmp(id);
        return emp;
    }

    @GetMapping("/add")
    public Result add(Emp emp){
        Result add = ef.add(emp);
        return add;
    }
    @GetMapping("/del")
    public Result del(){
        String id="1";
        Result del = ef.del(id);
        return del;
    }
    @GetMapping("/update")
    public Result update(Emp emp){
        String id="1";
        Result del = ef.update(id,emp);
        return del;
    }
}

没有连接数据库,在url地址直接输入测试

猜你喜欢

转载自blog.csdn.net/weixin_43458790/article/details/84669685
今日推荐